Flyway 升级 4.2.0 -> 5.0.0 迁移失败,即使指定了 flyway.table

Posted

技术标签:

【中文标题】Flyway 升级 4.2.0 -> 5.0.0 迁移失败,即使指定了 flyway.table【英文标题】:Flyway upgrading 4.2.0 -> 5.0.0 migrate fails even with flyway.table specified 【发布时间】:2019-09-13 03:59:38 【问题描述】:

我正在更新一些在我们的应用程序中落后的 maven 依赖项,并且在从 flyway-maven-plugin 4.2.0 升级时遇到问题,我们的 reset 和 migrate make 命令以我无法做到的方式失败'找不到任何有用的结果。

最初我尝试从 4.2.0 迁移到 5.2.4。当我无法解决我的错误时,我回退到 5.0.0 的单个版本。 根据 5.0.0 的发行说明,我已将 flyway.table=schema_version 添加到我的 flyway-$env.properties 文件中,并更新了我的 Makefile 命令以使用 -Dflyway.configFiles=

当我尝试迁移现有数据库 flyway 尝试应用所有脚本时,导致我们的初始数据库脚本违反约束。当无法锁定schema_version 表时,运行初始脚本后尝试迁移空数据库flyway 失败。

make 命令执行如下:

@mvn -pl db flyway:repair \
    -Dflyway.url="jdbc:mysql://$FLYWAY_TARGET_HOST:$FLYWAY_TARGET_PORT/$FLYWAY_TARGET_DB?useUnicode=true&characterEncoding=utf8&useSSL=false" \
    -Dflyway.password=$FLYWAY_TARGET_DB_PW \
    -Dflyway.user=$FLYWAY_TARGET_DB_USER \
    -Dflyway.configFiles="src/main/resources/config/flyway/$FLYWAY_CONFIG_FILENAME.properties"
@mvn -pl db flyway:migrate \
    -Dflyway.url="jdbc:mysql://$FLYWAY_TARGET_HOST:$FLYWAY_TARGET_PORT/$FLYWAY_TARGET_DB?useUnicode=true&characterEncoding=utf8&useSSL=false" \
    -Dflyway.password=$FLYWAY_TARGET_DB_PW \
    -Dflyway.user=$FLYWAY_TARGET_DB_USER \
    -Dflyway.configFiles="src/main/resources/config/flyway/$FLYWAY_CONFIG_FILENAME.properties"

在空数据库上运行时,提供以下输出:

[INFO] --- flyway-maven-plugin:5.0.0:migrate (default-cli) @ db ---
[INFO] Flyway Community Edition 5.0.0 by Boxfuse
[INFO] Database: jdbc:mysql://localhost:3306/db_test (MySQL 5.7)
[INFO] Successfully validated 46 migrations (execution time 00:00.029s)
[INFO] Creating Schema History table: `db_test`.`schema_version`
[WARNING] Could not find schema history table `db_test`.`schema_version`, but found `db_test`.`schema_version` instead. You are seeing this message because Flyway changed its default for flyway.table in version 5.0.0 to flyway_schema_history and you are still relying on the old default (schema_version). Set flyway.table=schema_version in your configuration to fix this. This fallback mechanism will be removed in Flyway 6.0.0.
[INFO] Current version of schema `db_test`: << Empty Schema >>
[INFO] Migrating schema `db_test` to version 1.0 - DbBaseline
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.799 s
[INFO] Finished at: 2019-04-23T18:12:57-04:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:5.0.0:migrate (default-cli) on project db: org.flywaydb.core.internal.exception.FlywaySqlException: 
[ERROR] Unable to lock table `db_test`.`schema_version`

【问题讨论】:

【参考方案1】:

清楚地看到这个问题后,问题出在我们的 V1.0 脚本中,特别是我们在创建表之前删除并重新创建了模式。这导致在应用 V1.0 脚本后,flyway 生成的表不存在。

删除此行后,所有 flyway 作业都将正常执行。幸运的是,flyway:repair 纠正了schema_version 表中的校验和,无需任何黑客或手动数据库编辑。

【讨论】:

以上是关于Flyway 升级 4.2.0 -> 5.0.0 迁移失败,即使指定了 flyway.table的主要内容,如果未能解决你的问题,请参考以下文章

Flyway H2和MySql升级后不匹配

Heroku Postgres 升级后 Flyway 无法连接到数据库

Flyway详解以及Springboot集成Flyway(转)

Flyway详解以及Springboot集成Flyway, 数据库脚本版本管理

Docker Flyway MySQL 8:客户端不支持服务器请求的身份验证协议。考虑升级 MariaDB 客户端

根据 Flyway,原始 SQL 脚本现在无效