【问题标题】:Spring Boot 1.5 to 2 migration - Flyway migration checksum mismatchSpring Boot 1.5 到 2 迁移 - Flyway 迁移校验和不匹配
【发布时间】:2018-12-11 17:36:02
【问题描述】:

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

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

Spring Boot recommends

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

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

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

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

问题的原因是什么,解决办法是什么?

【问题讨论】:

    标签: spring-boot flyway


    【解决方案1】:

    似乎校验和算法在版本之间发生了变化。 在Flyway 4 的(某些)版本中,

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

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


    Flyway 校验和算法:

    • 版本 3 - crc32 字节:

      bytes = resource.loadAsBytes()
      ...
      crc32.update(bytes);
      
    • 版本 5(不是逐字副本)- crc32 over lines(忽略 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"));
      }
      

    解决方案

    在Flyway repair with Spring Boot 的答案中提出了多种解决方案。

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

    【讨论】:

      【解决方案2】:

      可能最简单的方法是在真正迁移之前执行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 架构历史记录表。这将执行 以下操作:

      • 在没有 DDL 事务的数据库上删除所有失败的迁移(仍然必须手动清理遗留的用户对象)
      • 将已应用迁移的校验和、描述和类型与可用迁移重新对齐

      【讨论】:

        猜你喜欢
        • 2017-04-30
        • 2015-07-07
        • 2015-05-16
        • 2019-03-24
        • 1970-01-01
        • 2018-08-12
        • 2018-08-16
        • 2019-08-07
        • 2017-11-26
        相关资源
        最近更新 更多