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

时间:2018-07-03 11:54:53

标签: spring-boot flyway

Spring Boot 2升级到1.5时,虽然没有更改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。

  •   

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

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

2 个答案:

答案 0 :(得分:2)

似乎校验和算法在版本之间已更改。 在Flyway 4的(某些)版本中,

  

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

我不确定这是否意味着两个版本都计算出校验和,是否与旧版本匹配,是否用新版本更新,或者是否意味着用新版本盲目地覆盖了。


Flyway Checksum算法:

  • 版本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"));
    }
    

解决方案

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

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

答案 1 :(得分:0)

最简单的方法是在真正的迁移之前执行flyway.repair()

@Configuration
public class FlywayRepair {

    @Bean
    public FlywayMigrationStrategy repair() {
        return flyway -> {
            flyway.repair();
            flyway.migrate();
        };
    }
}

缺点是它还可以删除失败的迁移。从Flyway.repair()Javadoc:

  

修复Flyway模式历史记录表。这将执行   以下操作:

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