从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。
如果您无法控制部署并且无法两次部署应用程序(例如,用户下载了该应用程序的最新版本),则这是不容易实现的。
问题的原因是什么?解决方案是什么?
答案 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的回答中,提出了多种解决方案。
由于必须避免手动干预,因此我使用了FlywayMigrationStrategy
和jdbcTemplate
在启动时将校验和从固定的已知值更新为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事务的数据库上所有失败的迁移(仍然必须手动清理留下的用户对象)
- 将可用迁移的校验和,描述和类型与可用迁移对齐