Flyway 9.21.2升级后Db2的CURRENT_SCHEMA变更致迁移失败咨询
问题描述
将Flyway从8.4.1升级至9.21.2版本后,一个替换Java编写的外部函数的迁移任务失败,原因是Db2无法找到对应的Jar文件。经排查发现,是CURRENT_SCHEMA发生了变化。
为验证该问题,创建了测试迁移:
VALUES CURRENT_SCHEMA; deliberate cause error
Flyway 8.4.1执行结果
执行命令:
flyway-8.4.1 -defaultSchema=NYA_FLYWAY -schemas=DB2INST1,NYA_FLYWAY -table=FLYWAY_SCHEMA_HISTORY -driver=com.ibm.db2.jcc.DB2Driver -url=jdbc:db2://nya-01:50000/nya -user=db2inst1 -password=${passwd} -jarDirs=/home/lejo0004/. -locations="filesystem:/home/lejo0004/Project/db-legacy/nya/src/main/resources/db/migration" migrate
查询结果:
+----------+ | 1 | +----------+ | DB2INST1 | +----------+
Flyway 9.21.2执行结果
执行命令:
flyway-9.21.2 -defaultSchema=NYA_FLYWAY -schemas=DB2INST1,NYA_FLYWAY -table=FLYWAY_SCHEMA_HISTORY -driver=com.ibm.db2.jcc.DB2Driver -url=jdbc:db2://nya-01:50000/nya -user=db2inst1 -password=${passwd} -jarDirs=/home/lejo0004/. -locations="filesystem:/home/lejo0004/Project/db-legacy/nya/src/main/resources/db/migration" migrate
查询结果:
+------------+ | 1 | +------------+ | NYA_FLYWAY | +------------+
疑问
- 该
CURRENT_SCHEMA的变更是Flyway的有意设计吗? - 能否在不影响迁移执行用户寄存器的前提下指定历史表的schema?
解答
CURRENT_SCHEMA变更属于有意设计
Flyway 9.x版本调整了defaultSchema的行为:当指定该参数时,Flyway会将数据库连接的CURRENT_SCHEMA设置为该值;而8.x版本中defaultSchema仅用于指定Flyway历史表的存储位置,不会修改连接的当前schema。这个变更的目的是让迁移执行的上下文与指定的默认schema保持一致,避免潜在的对象引用歧义。可以在不影响迁移执行用户寄存器的前提下指定历史表的schema
无需通过defaultSchema指定历史表位置,直接使用table参数的完整限定名即可,格式为[schema_name].[table_name]。具体操作如下:- 移除
-defaultSchema=NYA_FLYWAY参数 - 将
-table=FLYWAY_SCHEMA_HISTORY修改为-table=NYA_FLYWAY.FLYWAY_SCHEMA_HISTORY - 保留
-schemas=DB2INST1,NYA_FLYWAY参数,确保Flyway能在指定schema中扫描迁移对象
- 移除
调整后的执行命令示例:
flyway-9.21.2 -schemas=DB2INST1,NYA_FLYWAY -table=NYA_FLYWAY.FLYWAY_SCHEMA_HISTORY -driver=com.ibm.db2.jcc.DB2Driver -url=jdbc:db2://nya-01:50000/nya -user=db2inst1 -password=${passwd} -jarDirs=/home/lejo0004/. -locations="filesystem:/home/lejo0004/Project/db-legacy/nya/src/main/resources/db/migration" migrate
这样设置后,Flyway会将历史表存储在NYA_FLYWAY schema中,迁移执行时的CURRENT_SCHEMA会保持为用户登录的默认schema(即DB2INST1),不会影响外部函数对Jar文件的查找路径。
内容的提问来源于stack exchange,提问作者Lennart - Slava Ukraini
相关产品推荐
相关产品推荐

