将 Flyway Maven 插件从 2.3 升级到 3.0 后,我得到:
[错误]执行目标失败 org.flywaydb:flyway-maven-plugin:3.0:在项目上迁移(default-cli) xxx:org.flywaydb.core.api.FlywayException:验证失败。成立 已应用迁移和可用迁移之间的差异: 迁移的迁移校验和不匹配 V003__data_feed_sources_locations.sql:DB = 942424992, 类路径=1117634405 -> [帮助 1]
在其他项目上遇到类似的错误。
如果我降级回 2.3,迁移运行正常。这是否与计算校验和的不同平台编码有关?
有什么解决方法,或者更好的是,正确的解决方案?
Flyway 3.0 将 validateOnMigrate 的默认值更改为 true。
然而,这是一件好事,因为本着快速失败的精神,错误会更快被发现。
在您的情况下,一些脚本自应用以来确实发生了变化,这就是 Flyway 所报告的内容。
您有两个选择:
Flyway.repair()
重新对齐校验和参考
飞路修复
添加 Axel Fontaine 的答案:
我能够使用 mvn Flyway:repair,但我必须将
flyway.locations
配置属性指向包含我的数据库迁移脚本的文件夹。否则,我会收到消息“不需要修复元数据表 xyz.schema_version。未检测到失败的迁移。”就像其他人提到的那样。
我使用了
mvn -Dflyway.locations=filesystem:<project dir>/src/main/resources/db/migrations flyway:repair
,我看到元数据表中的校验和已更新,解决了我的问题。
首先,它查找校验和更改。如果我们更新已应用于数据库实例的迁移文件,就会发生这些更改。
FlywayException:验证失败:迁移版本 18.2.6 的迁移校验和不匹配
-> 应用于数据库:90181454
-> 本地解决:717386176
repair() 方法将通过使用本地校验和值更新 flyway_schema_history 表来修复校验和问题。
但是,它会忽略同一迁移文件中更新的语句。因此,同一文件中的新更改将被忽略,因为 flyway_schema_history 表中已经有版本条目。 setValidateOnMigrate() 方法在这种情况下不起作用。我们应该遵循增量方法,架构更改应该通过新文件提供。
我发现解决此问题的最简单方法是将架构表中的校验和更新为 Flyway 预期的值。我知道我的迁移文件没有改变,数据库的当前状态就是它需要的状态。我也不想花时间阅读文档和搞乱
Flyway.repair()
或其他可能潜在地把事情搞得更糟的方法。一个简单的sql更新就立即解决了它
问题发生在我更改了V1_2__books.sql ddl文件后,应该有更好的方法来强制flyway识别新的更改!!!
我尝试运行 mvn Flyway:repair 但它不起作用,我最终将 application.properties 文件 [datasource.flyway.url] 中的架构 url 更改为 books2
我也删除了以下文件(books 是我的旧模式名称)
~ @~:rm books.mv.db
~ @~:rm -r books.trace.db
datasource.flyway.url=jdbc:h2:file:~/books2
datasource.flyway.username=sa
datasource.flyway.password=
datasource.flyway.driver-class-name=org.h2.Driver
我运行了应用程序并进行了宾果游戏:)
直接从配置调用
Flyway.repair()
。
将以下 bean 添加到您的配置类中,或使用
@Congiguration
注释创建一个新类并添加以下代码。
@Bean
public FlywayMigrationStrategy repairFlyway() {
return flyway -> {
// repair each script's checksum
flyway.repair();
// before new migrations are executed
flyway.migrate();
};
}
只是想补充一点,为了通过修复来更新校验和。 Flyway 必须有权访问所有迁移所在的目录。否则,flyway 只是继续它的业务和输出
“修复元数据表中失败的迁移
。xyz
不必要。未检测到失败的迁移。”schema_version
需要使用 Flyway Repair 命令更新校验和(按照“升级过程”中所述运行 Flyway 命令,但将“migrate”替换为“repair”)。
我建议你不要直接侵入数据库、sql脚本等。这可能很危险
示例:
./flyway repare -user=root -password=changeme -url=jdbc:mysql://localhost/mypath -table=my_flyway_schema_version_table -locations=filesystem:/mypath_sql_scripts
如果您在本地数据库上运行,您可以删除 Flyway_schema_history 表
如果您使用本地数据库并遇到校验和不匹配错误,您可以从导致不匹配的版本开始从 Flyway 架构历史记录表中删除行。之后,您可以重新运行迁移,Flyway 将再次应用迁移并生成新的校验和。
还有另一种解决方案。您可以从 schema_version 表中删除迁移。