Flyway 3.0 迁移校验和不匹配

问题描述 投票:0回答:11

将 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,迁移运行正常。这是否与计算校验和的不同平台编码有关?

有什么解决方法,或者更好的是,正确的解决方案?

maven flyway
11个回答
115
投票

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

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

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

您有两个选择:

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

参考
飞路修复


24
投票

添加 Axel Fontaine 的答案:

我能够使用 mvn Flyway:repair,但我必须将

flyway.locations
配置属性指向包含我的数据库迁移脚本的文件夹。否则,我会收到消息“不需要修复元数据表 xyz.schema_version。未检测到失败的迁移。”就像其他人提到的那样。

我使用了

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


10
投票

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

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

-> 应用于数据库:90181454

-> 本地解决:717386176

repair() 方法将通过使用本地校验和值更新 flyway_schema_history 表来修复校验和问题。

但是,它会忽略同一迁移文件中更新的语句。因此,同一文件中的新更改将被忽略,因为 flyway_schema_history 表中已经有版本条目。 setValidateOnMigrate() 方法在这种情况下不起作用。我们应该遵循增量方法,架构更改应该通过新文件提供。


9
投票

我发现解决此问题的最简单方法是将架构表中的校验和更新为 Flyway 预期的值。我知道我的迁移文件没有改变,数据库的当前状态就是它需要的状态。我也不想花时间阅读文档和搞乱

Flyway.repair()
或其他可能潜在地把事情搞得更糟的方法。一个简单的sql更新就立即解决了它


2
投票

问题发生在我更改了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

我运行了应用程序并进行了宾果游戏:)


2
投票

直接从配置调用

Flyway.repair()

将以下 bean 添加到您的配置类中,或使用

@Congiguration
注释创建一个新类并添加以下代码。

    @Bean
    public FlywayMigrationStrategy repairFlyway() {
        return flyway -> {
            // repair each script's checksum
            flyway.repair();
            // before new migrations are executed
            flyway.migrate();
        };
    }

1
投票

只是想补充一点,为了通过修复来更新校验和。 Flyway 必须有权访问所有迁移所在的目录。否则,flyway 只是继续它的业务和输出

“修复元数据表中失败的迁移

xyz
schema_version
不必要。未检测到失败的迁移。”


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


1
投票

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


0
投票

如果您使用本地数据库并遇到校验和不匹配错误,您可以从导致不匹配的版本开始从 Flyway 架构历史记录表中删除行。之后,您可以重新运行迁移,Flyway 将再次应用迁移并生成新的校验和。


-4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.