Flyway 3.0迁移校验和不匹配

时间:2014-05-21 07:27:33

标签: maven flyway

将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,   Classpath = 1117634405 - > [帮助1]

在其他项目上也有类似的错误。

如果我降级回2.3,迁移运行正常。这是否与用于计算校验和的不同平台编码有关?

任何解决方法,或更好的解决方案?

9 个答案:

答案 0 :(得分:78)

Flyway 3.0将validateOnMigrate的默认值更改为true。

然而,这是一件好事,因为快速失败的精神,错误很快就会被发现。

在您的情况下,一些脚本在应用后确实发生了变化,这就是Flyway报告的内容。

您有两种选择:

  • 通过将validateOnMigrate设置为false(2.3默认行为)
  • 来抑制错误
  • 调用Flyway.repair()重新分配校验和

答案 1 :(得分:15)

添加到Axel Fontaine的答案:

我能够使用mvn flyway:修复,但我必须将flyway.locations config属性指向包含我的db迁移脚本的文件夹。否则我会收到消息“修复元数据表xyz.schema_version没有必要。没有检测到失败的迁移。”像其他人一样提到。

我使用mvn -Dflyway.locations=filesystem:<project dir>/src/main/resources/db/migrations flyway:repair,我看到元数据表中更新了校验和,解决了我的问题。

答案 2 :(得分:2)

问题发生在我更改了V1_2__books.sql ddl文件后,应该有更好的方法来强制飞路识别新的更改!!!

我试图运行mvn flyway:修复但它没有用,我最终将application.properties文件[datasource.flyway.url]中的架构URL更改为books2

我也删除了以下文件(书籍是我的旧架构名称)

~ @~: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

我运行了应用程序和BINGO :)

答案 3 :(得分:1)

我发现解决此问题的最简单方法是将模式表中的校验和更新为期望的flyway值。我知道我的迁移文件没有改变,并且数据库的当前状态是它所需要的。我也不想花时间阅读文档并乱用Flyway.repair()或其他可能可能更糟糕的方法。一个简单的SQL更新立即解决了它

答案 4 :(得分:1)

首先,它查找校验和更改。如果我们更新已应用于数据库实例的迁移文件,则会发生这些更改。

FlywayException :验证失败:迁移版本18.2.6的迁移校验和不匹配

- &GT;适用于数据库:90181454

- &GT;本地决议:717386176

repair()方法会通过使用本地校验和值更新 flyway_schema_history 表来解决校验和问题。

但是,它会忽略同一个迁移文件中的更新语句。因此,同一文件中的新更改将被忽略,因为 flyway_schema_history 表中已存在版本条目。 setValidateOnMigrate()方法在此方案中无效。我们应该遵循增量方法,应该通过新文件提供模式更改。

答案 5 :(得分:1)

需要使用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

答案 6 :(得分:0)

只想添加,以便通过修复来更新校验和。 Flyway必须有权访问所有迁移所在的目录。否则,flyway只会影响其业务和产出

  

“在元数据表xyz中修复失败的迁移。schema_version不必要。未检测到失败的迁移。”

答案 7 :(得分:0)

如果您在本地数据库上运行,则可以删除flyway_schema_history表

答案 8 :(得分:-2)

还有另一种解决方案。您可以从 schema_version 表中删除迁移。