使用 DB2 驱动程序从 Flyway 命令行获取连接错误

Posted

技术标签:

【中文标题】使用 DB2 驱动程序从 Flyway 命令行获取连接错误【英文标题】:Getting connection error from Flyway command line with DB2 drivers 【发布时间】:2021-11-16 09:38:20 【问题描述】:

我们正在将数据库版本从 DB2 11.1.3 升级到 DB2 11.5.6。我们使用 Flyway 迁移代码已有 4 年了。我们使用的版本是 5.1.3,它运行良好,除了它抛出一个警告 DB2 11.5 is not supported。

我已经下载并尝试在我们的过程中使用 Flyway 7.13.0 和 7.15.0,但它们都抛出以下错误

ERROR: Unable to obtain connection from database (jdbc:db2://VAN-FCALLANDER:50000/TMLCLCUR:retrieveMessagesFromServerOnGetMessage=true;) for user 'TMWIN': [jcc][10214][10050][4.29.24] java.util.Properties object passed to java.sql.Driver.connect() cannot be overridden by URL: jdbc:db2://VAN-FCALLANDER:50000/TMLCLCUR:retrieveMessagesFromServerOnGetMessage=true;. ERRORCODE=-4461, SQLSTATE=42815
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL State  : 42815
Error Code : -4461
Message    : [jcc][10214][10050][4.29.24] java.util.Properties object passed to java.sql.Driver.connect() cannot be overridden by URL: jdbc:db2://VAN-FCALLANDER:50000/TMLCLCUR:retrieveMessagesFromServerOnGetMessage=true;. ERRORCODE=-4461, SQLSTATE=42815


Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][10214][10050][4.29.24] java.util.Properties object passed to java.sql.Driver.connect() cannot be overridden by URL: jdbc:db2://VAN-FCALLANDER:50000/TMLCLCUR:retrieveMessagesFromServerOnGetMessage=true;. ERRORCODE=-4461, SQLSTATE=42815

根据IBM的说法,返回的错误来自Flyway设置参数的方式。 https://www.ibm.com/docs/en/db2/11.5?topic=errors-errorcode-4461 我尝试过使用 11.1 (type3) 驱动程序和 11.5 (type4) 驱动程序,两者都抛出相同的消息。

知道如何在不按照 IBM 建议的方式更新实际 Flyway 代码的情况下解决这个问题吗?

【问题讨论】:

请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

看起来 Flyway 代码可能需要一些更改。

查看他们的issues 页面,如果那里不存在票证,请打开票证。

否则现在有可能的解决方法。

在您的特定情况下,附加到 URL 的属性会触发异常,因此您可以尝试:

(1)修改flyway.url去掉:retrieveMessagesFromServerOnGetMessage=true

(2) 更改 flyway 配置以通过 fltway.jdbcProperties(或等效方法)提供此属性,如果在您的 flyway 版本中启用:flyway.jdbcProperties.retrieveMessagesFromServerOnGetMessage=true。查看文档 https://flywaydb.org/documentation/configuration/parameters/jdbcProperties

(3) 通过 IBM db2dsdriver.cfg 从外部配置您需要的连接属性。有关详细信息,请参阅 IBM Db2 文档。想法是您可以将所有(或部分)数据源名称详细信息和参数放入 XML 文件 (db2dsdriver.cfg),然后 Db2 驱动程序将在运行时对其进行解析以执行您的指令。

(4) 从 URL 中删除该属性,并且在修复 flyway 代码之前没有详细的错误消息。

【讨论】:

问题现在在这里:github.com/flyway/flyway/issues/3285 - 非常感谢! 毛,谢谢你的建议。我已经实现了第 2 项 - 配置文件更新以包含一个 flyway.jdbcProperties 行,该行在运行我的补丁时效果很好;但是,该属性仅在 Teams 版本下可用,并且在我请求时不提供版本号。我希望朱莉娅为此提出的问题早日解决 更新 - 7.15 不会返回版本号,但 7.13 会。在 7.13 中测试了其他几个开关,似乎与配置属性一起正常工作 我在使用 DBeaver 连接到 DB2 数据库时遇到了类似的问题,遇到了同样的错误和错误代码。第 1 步和第 2 步有效地为我解决了这个问题。

以上是关于使用 DB2 驱动程序从 Flyway 命令行获取连接错误的主要内容,如果未能解决你的问题,请参考以下文章

Flyway Java 迁移在命令行工具中不起作用

在命令行中执行 flyway 回调

db2如何创建存储过程

Flyway 命令行:无效参数:-placeholders

flyway 命令行工具 - 重新执行失败的 DDL 的选项是啥?

如何为 gradle 任务命令行参数提供 flyway 密码?