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

And*_*ete 5 flyway spring-boot

升级到Spring Boot 2from 时1.5,虽然 SQL 脚本没有改变,但出现以下错误:

Migration checksum mismatch for migration version 1
-> Applied to database : 1395032327
-> Resolved locally    : -175919814
Run Code Online (Sandbox Code Playgroud)

Spring Boot推荐

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

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

  • 一旦您的架构升级到 Flyway 4,升级到 Spring Boot 2 并再次运行迁移以将您的应用程序移植到 Flyway 5。

如果您不控制部署并且您不能两次部署应用程序(例如,用户下载应用程序的最新版本),这将是不可能的。

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

And*_*ete 4

不同版本之间的校验和算法似乎有所不同。在(某些)版本中Flyway 4

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

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


Flyway校验和算法:

  • 版本 3 - 字节上的 crc32:

    bytes = resource.loadAsBytes()
    ...
    crc32.update(bytes);
    
    Run Code Online (Sandbox Code Playgroud)
  • 版本 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"));
    }
    
    Run Code Online (Sandbox Code Playgroud)

解决方案

在使用 Spring Boot 修复 Flyway的答案中,提出了多种解决方案。

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