当前位置: 首页 > 知识库问答 >
问题:

Spring Boot 1.5到2迁移- Flyway迁移校验和不匹配

苍温文
2023-03-14

1.5升级到Spring Boot 2时,我收到以下错误,尽管SQL脚本没有改变:

Migration checksum mismatch for migration version 1
-> Applied to database : 1395032327
-> Resolved locally    : -175919814

Spring Boot建议

为确保架构升级顺利进行,请按照以下说明操作:

> < li>

首先将您的1.5.x Spring Boot应用程序升级到Flyway 4(撰写本文时为4.2.0),请参见Maven和Gradle的说明。

将架构升级到 Flyway 4 后,升级到Spring启动 2 并再次运行迁移以将应用程序移植到 Flyway 5。

如果您不控制部署并且不能两次部署应用程序(例如,用户下载最新版本的应用程序),这就不容易实现。

问题的原因是什么,解决方案是什么?

共有2个答案

江正德
2023-03-14

可能最简单的方法是执行<code>flyway。repair()在实际迁移之前:

@Configuration
public class FlywayRepair {

    @Bean
    public FlywayMigrationStrategy repair() {
        return flyway -> {
            // repair each script checksum 
            flyway.repair();
            // before migration is executed 
            flyway.migrate();
        };
    }
}

缺点是它还删除了失败的迁移。来自Flyway。repair()Javadoc:

修复Flyway架构历史表。这将执行以下操作:

    < li >在没有DDL事务的数据库上删除任何失败的迁移(留下的用户对象仍必须手动清理) < li >将已应用迁移的校验和、描述和类型与可用迁移的校验和、描述和类型重新对齐
南门嘉
2023-03-14

看来校验和算法在不同版本之间已经发生了变化。在(某些)版本的<code>Flyway 4</code>中,

所有校验和在第一次运行时会自动重新计算并使用新算法更新(Flyway#253)

我不确定这是否意味着校验和是用两个版本计算的,如果它与旧版本匹配,则用新版本更新,或者它是否意味着它被新版本盲目覆盖。

飞行路线校验和算法:

>

  • 版本 3 - crc32 超过字节:

    bytes = resource.loadAsBytes()
    ...
    crc32.update(bytes);
    

    版本 5(不是逐字副本)- 行上的 crc32(忽略 CR/LF,并使用 UTF-8 编码):

    BufferedReader bufferedReader = new BufferedReader(new StringReader(resource.loadAsString(configuration.getEncoding())));
    [...]
    while ((line = bufferedReader.readLine()) != null) {
        crc32.update(line.getBytes("UTF-8"));
    }
    

    解决方案

    在使用Spring Boot的飞行道维修的答案中,提出了多种解决方案。

    因为必须避免手动干预,所以我使用了FlywayMigrationStrategyjdbcTemplate在启动时将校验和从固定已知值更新为Flyway 5所需的新固定已知值。

  •  类似资料:
    • 将Flyway Maven插件从2.3升级到3.0后,我得到了: [错误]无法在项目xxx上执行目标org.flywaydb:flyway-maven-plugin:3.0:migrate(default-cli):org.flywaydb.core.api.flywayexception:验证失败。发现应用的迁移和可用的迁移之间存在差异:迁移V003__data_feed_sources_loc

    • Flyway 4.2.0中的可重复Java迁移存在问题。 例如,我编写了一个可重复的Java迁移,它为每个具有特定列的表创建一个触发器。此迁移的ChecksumProvider计算缺少触发器的表的连接名称的哈希代码。 > 当表列表不为空时,hashcode不同于零(将其命名为xxx),并且对于每个表,都会向数据库添加一个合适的触发器。在这种情况下,hascode xxx被写入“schema_ver

    • 我正在flyway的CMD中运行命令,但脚本文件的迁移会出现以下异常 [错误]无法执行目标组织。flywaydb:flyway maven插件:3.2.1:在convertopia auto db:org项目上迁移(默认cli)。flywaydb。果心应用程序编程接口。FlywayException:验证失败。迁移1.0.53的迁移描述不匹配[错误]- 我尝试过,它说构建成功,但问题仍然没有解决。

    • 每次更改DB结构时,我都使用时间戳创建一个新的迁移文件,以便按顺序执行,在一个干净的数据库中使用migrate命令(使用maven插件或命令行工具),它可以很好地工作,但在一个生产数据库中,使用相同的DB结构但添加了数据,我会得到以下错误:

    • 我在一株嵌入的野花上做了阿奎利亚测试。尽管所有移植脚本、集成器类(flyway在其中安装)和所有FlyWay包(来自POM文件)都包含在。war文件(部署在嵌入式wildfly上),不进行迁移。 这有什么原因吗?这是原则上不起作用还是我错过了什么? 我喜欢实现的是,arquillian运行的自动测试将设置一个内存数据库,其方案与使用相同迁移脚本的生产数据库相同。 编辑:正如ytg下面所问的,我添加

    • 我们面临一个问题:假设一个开发人员在处理分支a的过程中提供了一个新的迁移版本,比如说V331,同时一个QA人员在另一个分支B的QA环境中进行QA。可能会出现qa环境已经有v331版本的情况,因为几个开发人员可能会在不同的时间在不同的分支上创建相同的版本号……更多的是qa经常在分支之间切换,这就是qa数据库变得混乱的原因,特别是表schema_version,这导致我们手动删除损坏的模式版本,解决旧