Scala项目Flyway迁移被标记为成功但无实际数据变更如何排查
Flyway迁移标记成功但无实际执行的排查步骤
- 确认Java迁移类的命名符合规范
继承BaseJavaMigration的类必须严格遵循V<版本号>__<迁移名称>的命名规则,版本号需与迁移的版本42完全匹配,版本号和名称之间必须是两个下划线,类名大小写、字符完全匹配你配置的迁移名称。如果命名不符合规则,Flyway仅会识别迁移元数据,不会加载执行你写的业务逻辑。 - 校验迁移方法的签名是否正确
BaseJavaMigration要求必须重写public void migrate(Context context) throws Exception方法,如果你写错了方法名、参数列表,或者仅做了方法重载,Flyway会执行父类的空migrate实现,自然不会有任何业务逻辑运行,也不会输出日志,同时会快速执行完成标记为成功,完全符合你遇到的短耗时现象。 - 开启Flyway DEBUG日志排查加载流程
在logback配置中将org.flywaydb包的日志级别调整为DEBUG,重启执行迁移,可以看到完整的迁移类扫描、加载、实例化、执行的全流程日志,能明确看到你的迁移类是否被正确加载、是否执行了自定义的migrate方法、过程中是否有异常被默认吞掉。 - 验证事务配置是否正常
Flyway默认会将整个迁移逻辑包裹在事务中执行,首先检查你的迁移代码中是否有手动回滚事务的逻辑,其次确认你操作的表是否支持事务(如MySQL MyISAM引擎表不支持事务,变更会自动丢失),另外排查是否配置了flyway.transactionsEnabled=false导致事务异常回滚。 - 增加强制输出或异常验证执行路径
直接在你写的migrate方法第一行增加System.out.println强制输出,或者主动抛出RuntimeException,重新执行migrate命令:如果执行时出现你加的输出/抛出的异常,说明迁移逻辑能被正常执行,问题出在你后续的业务代码中;如果没有任何输出也没有报错,说明Flyway完全没有进入你写的migrate方法。 - 核对Flyway元数据表记录
直接查询数据库中的flyway_schema_history表,找到version=42的记录,检查script字段的值是否为你写的迁移类的全限定类名,如果不是说明存在重名迁移类、或者类路径下有重复的迁移定义覆盖了你的代码。 - 排查版本兼容问题
Flyway 6.5.7存在部分Java迁移类加载的已知小BUG,你可以临时将flyway-core的版本升级到最新的6.x稳定版(如6.5.14)重新执行迁移,排查是否是版本本身的问题导致逻辑未执行。
内容的提问来源于stack exchange,提问作者Anton Belev
相关产品推荐
相关产品推荐

