当 flyway 进程崩溃时,Flyway 不处理隐式提交的语句

Flyway does not handle implicity committed statements when flyway process crashes

运行最近在使用SpringBoot(1.2.3)和Flyway(3.1)遇到这种情况,没怎么处理:

服务器正在启动并针对 mysql 数据库 (5.6) 执行较长的 运行ning alter table 添加列语句 (5.6) 20-30 分钟。由于脚本正在 运行ning 服务器进程被硬终止,因为它在给定的时间范围内没有响应健康检查。由于 MySQL 服务器正在处理语句,它会继续处理语句直至完成,但脚本未标记为失败或成功。当另一台服务器启动时,它试图执行失败的脚本,因为该列已经存在。

考虑到服务器可能在长时间的 运行ning 脚本期间因任何原因随时崩溃,而不是幂等脚本或手动数据库升级过程,希望了解处理这种情况的既定模式。

可能是指示服务器平台使用隐式提交的设置,因此在将脚本发送到服务器时将其标记为 运行?

你提出了一个很好的观点,但不幸的是,我认为 Flyway 或 Spring Boot 对此没有任何原生支持。

一种变通方法(尽管很丑)是实现 Flyway 提供的 beforeEachMigrate and afterEachMigrate 回调。您可以使用它们来维护一个单独的迁移 table,以跟踪哪些迁移已经开始,哪些已经完成。然后,如果下次您的应用程序启动时它包含未完成的迁移,您可以关闭它 并显示一条描述性错误消息.

我建议创建一个关于它的 feature request。如果你这样做,请link我们给它!

我的方法是为任何具有隐式提交的长 运行 SQL 单独的迁移脚本。 Flyway 使得添加次要版本编号的脚本变得非常容易,因此没有充分的理由根据您的建议使实现过于复杂。如果您使用的是 PostgreSQL,您可能不需要这样做,但 Oracle 和 MySQL 会需要它。