如何使用Flyway回滚迁移?

MyBatis迁移将每个SQL文件分成两部分:

  1. 一个用于迁移一个版本
  2. 一个用于迁移回一个版本

如何使用Flyway回滚版本?

在FAQ中find答案:

那么降级脚本/向下迁移呢?

Flyway不支持降级脚本。

降级脚本(由Rails Migrations推广)的理念在理论上是不错的,不幸的是它在实践中被打破了。 只要你有破坏性的变化(删除,删除,截断,…),你开始陷入困境。 即使你不这样做,你最终也会创build自制的备份来恢复备份,这也需要经过适当的testing。

降级脚本假定整个迁移失败。

迁移可能会在任何时候失败。 如果你有10条语句,第一,第五,第七或第十条可能会失败。 根本没有办法事先知道。 降级脚本被写入回滚整个迁移。 这使得它们实际上无用,即使是非破坏性的改变。

保持数据库与生产中当前部署的代码的所有版本之间的向后兼容性。

这样一个失败的迁移不是一场灾难。 旧版本的应用程序仍然与数据库兼容,因此您可以简单地回滚应用程序代码,进行调查并采取纠正措施。

一个更好的解决scheme是一个适当的,经过充分testing的备份和恢复策略。

它独立于数据库结构,一旦经过testing并certificate可行,则不会有任何迁移脚本可以破坏它。 为获得最佳性能,并且您的基础架构支持此function,我们build议您使用底层存储解决scheme快照技术 。 特别是对于较大的数据量,这比传统的备份和恢复要快几个数量级

我假设你需要一个回滚策略,例如当一个合作伙伴在生产阶段失败,他的部署对于你的发布是必不可less的。

你可以这样命名你的flyway SQL脚本:
V <YourReleaseNumber> .000_ <description> .sql

现在你可以离开了
V <YourReleaseNumber> .998_rollback.sql回滚
并使V <YourReleaseNumber> .999_reenroll.sql重新注册。

在您的CI / CD环境中,在部署作业之后,还需要2个作业(手动触发)。 一个用于回滚,运行回滚过程,包括飞路迁移。 其他重新注册。
你只需要关心飞路上的目标configuration。
对于您的部署工作,您的目标应该是<YourReleaseNumber> .997
为您的回滚工作<YourReleaseNumber> .998

当您启动新版本时,请确保您不会运行旧版本的回滚/重新注册脚本。

正如前面所说,经过很好的testing,备份和恢复策略是推荐的解决scheme。

(因为英文不好)

我发现最好的办法就是把数据库清理干净,然后把它迁移到你想恢复的特定版本。

正如常见问题所build议的那样,回滚脚本在理论上是好的,但是一些迁移不能被回滚。 (例如,如果一个表被删除,恢复表DDL很容易,但是恢复它所包含的数据可能很困难。)