当前位置: 首页 > 面试题库 >

如何使用Flyway回滚迁移?

宋洲
2023-03-14
问题内容

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

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

如何使用Flyway回滚版本?


问题答案:

尽管Flyway支持回滚(仅作为商业功能),但不鼓励使用它:

https://flywaydb.org/documentation/command/undo

尽管撤消迁移的想法很好,但不幸的是,有时它在实践中会崩溃。一旦您进行了破坏性的更改(删除,删除,截断……),便开始遇到麻烦。即使不这样做,您最终也将创建用于还原备份的自制替代方法,这些替代方法也需要进行适当的测试。

撤消迁移假定整个迁移成功,现在应该撤消。对于没有DDL事务的数据库,如果版本迁移失败,这将无济于事。为什么?迁移随时可能失败。如果您有10条语句,则第1,第5,第7或第10条可能会失败。根本没有事先知道的方法。相反,撤消迁移被编写为撤消整个版本的迁移,在这种情况下将无济于事。

我们发现更可取的另一种方法是保持数据库与当前在生产环境中部署的所有版本的代码之间的向后兼容性。这样,失败的迁移就不会成为灾难。该应用程序的旧版本仍与数据库兼容,因此您可以简单地回滚html" target="_blank">html" target="_blank">应用程序代码,进行调查并采取纠正措施。

这应该辅之以适当的,经过良好测试的备份和还原策略。它独立于数据库结构,并且一旦经过测试并证明其可以工作,任何迁移脚本都无法破坏它。为了获得最佳性能,并且在基础架构支持的情况下,我们建议使用基础存储解决方案的快照技术。特别是对于较大的数据量,这可能比传统的备份和还原快几个数量级。



 类似资料:
  • 出身背景 我正在使用命令行界面对DB2运行flyway迁移。我做了很多测试,一切都很好。我添加了一些命令以导致失败。 问题 有人能确认如果迁移失败并且数据库支持DDL,是否应该回滚更改表、删除表或创建表吗?当我测试它时,它看起来像是在同一个flyway脚本中失败后没有回滚更改表添加列语句。

  • 我们中的两个人在不同的GIT分支中制作了一个迁移脚本。现在,我已经拉动了源开发分支,并更正了 GIT 合并问题,并将我的迁移脚本重命名为最后一个。因此,数据库的新初始化和从开发分支的版本迁移数据库将是可以的。 然而,我的本地测试数据库中有很多数据,所以我手动应用了我在GIT中引入的新迁移脚本。然而,我不能让flyway认为,一切都很好。 那么,我如何才能伪造迁移? 当我尝试迁移时,我收到以下错误:

  • 我在gradle中使用flyway,我在数据库控制台中手动运行了其中一个迁移,我想运行flyway,但告诉它忽略所有其他迁移版本之间的一个特定迁移版本。可以这样做吗?

  • 我有一个flyway项目,在对数据库运行迁移之前,我想运行一个java回调来更改某些sql文件的名称。不幸的是,迁移首先针对数据库运行,然后调用回调来更改文件名。 这是我的回调类: 但是在< code>schema_version表中,我看到以下条目: 它应该说 如何让flyway在运行迁移之前更改文件名? 编辑1:所以看起来flyway正在运行迁移,然后执行回调以更改文件名,然后再次运行迁移,因

  • 问题内容: 我了解到使用Java进行flywaydb迁移可与JDBC连接一起使用,并且还可以通过SpringTemplate进行spring支持,但是flyway不适用于DAO。 对于具有更多关系的表/实体,使用DAO而不是sql进行迁移使工作变得更加容易。 是否有解决方案或解决方法来解决此问题? 问题答案: 首先,Flyway拥有自己的事务管理系统,并且不使用Spring事务处理。 如果您的DA

  • 我目前正在研究Flyway作为Liquibase的替代方案,但在文档中无法找到以下问题的答案: 假设在生产环境中部署后发现迁移包含错误。回想起来,不应该按原样执行,但已经太晚了。但是,我们想用固定版本的替换迁移,这样从头开始填充的数据库就不会遭受相同的错误。 在 Liquibase 中,您将修复原始变更集并使用