You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 |
+------------+

疑问

  1. 该CURRENT_SCHEMA的变更是Flyway的有意设计吗?
  2. 能否在不影响迁移执行用户寄存器的前提下指定历史表的schema?

解答
  1. CURRENT_SCHEMA变更属于有意设计
    Flyway 9.x版本调整了defaultSchema的行为:当指定该参数时,Flyway会将数据库连接的CURRENT_SCHEMA设置为该值;而8.x版本中defaultSchema仅用于指定Flyway历史表的存储位置,不会修改连接的当前schema。这个变更的目的是让迁移执行的上下文与指定的默认schema保持一致,避免潜在的对象引用歧义。

  2. 可以在不影响迁移执行用户寄存器的前提下指定历史表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:53:24