我们通过Java API使用Flyway 4来对抗MySQL 5.6(不支持事务DDL)。我们遇到迁移失败的常见情况,有时会出现逻辑错误,有时因为有人弄乱了数据库而且事情处于正确的状态。
所以我想知道,在这种情况下我们是否应该删除schema_version
中的行并重新运行迁移,修复迁移还是修复数据库?我们通常在迁移之前运行修复以修复任何失败的迁移,但随后添加新的迁移。
另请参阅:Should I be worried about creating idempotent migrations while using Flyway?
答案 0 :(得分:1)
过去几年我一直在使用Flyway 3,最近刚升级到4。到目前为止,它成功地管理了大约30个不同的项目,并且非常适合交付管道。
在那两年中,我们肯定经历过几次迁移,这些迁移是我们想要从历史中消除的开发者机器。在这些情况下,从schema_version
删除一行通常就是答案 - 它比repair
更快,流程更少,并且在我们的情况下风险更小。话虽这么说,它只是开发/测试环境 - 所以总是有一个非生产环境只接受工作迁移而没有失败/不需要的。
我们的目标绝对是使失败的迁移成为构建时间问题。因此,验证迁移版本,执行迁移本身以及作为组件构建的一部分针对迁移的数据库运行组件。我说这在处理如此大量的迁移管理项目时,很大程度上导致了我们不常发生的问题。
无法回想起我在哪里阅读它,以及它是否在Flyway的背景下,但它是The price we pay for this kind of automation is discipline
的内容 - 所以听到类似“有人用数据库手动乱搞”这样的话肯定会对我来说是个红旗。
总结......
我认为最小化失败的机会是关键。但是当失败确实发生时,将您的策略定义为达到可接受的风险水平是您可以做的最好的事情 - repair
并且删除schema_version
都有其缺点。