【问题标题】:How is liquibase rollback supposed to work?liquibase 回滚应该如何工作?
【发布时间】:2014-12-04 16:53:14
【问题描述】:

我刚刚开始使用 liquibase,它似乎非常有用。我最大的问题是回滚。

我正在将我的 liquibase 更改日志烘焙到其中包含我的数据层的 jar 中,并且在应用程序启动时,我正在使用应用程序中的 jar 中的更改日志自动迁移。如果我只是前进,这很好。

但是,如果我有两个分支,每个分支都在该数据层 jar 上工作,并且我想使用同一个数据库在它们之间来回切换,则它不起作用,因为一个分支中的变更日志与另一个分支中的变更集不同。就其本身而言,这不是问题,但是当我交换分支并启动我的应用程序时,它不知道如何从另一个分支回滚变更集,因为它们还没有在变更日志中。

这里的答案是要小心吗?总是使用单独的数据库?

为什么不将回滚放到数据库中的 DATABASECHANGELOG 表中,这样未知的变更集就可以在没有变更日志文件的情况下回滚?

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    你说得对,回滚只是查看 DATABASECHANGELOG 表中应用的更改,并根据更改日志中的内容回滚 changeSet。它可以将回滚信息存储在 DATABASECHANGELOG 表中,但出于简单、空间和安全等多种原因,它不会。有时也可以根据更新的 changeSet 回滚信息而不是第一次执行 changeSet 时设置的内容来回滚更改。

    在您的情况下,回滚更复杂,因为您希望经常切换分支。我通常发现功能分支倾向于进行相对独立的更改,因此即使您在分支之间进行更改,您也可以保留数据库更改,因为它们创建了其他代码简单地忽略的新表或列。有时这不是真的,但在开发环境中,您会立即发现问题并可以根据需要解决它们。当您确实需要从另一个分支回滚更改时,您可以记住在切换分支之前回滚更改。有些团队根本不关心回滚,只是在需要时重建他们的开发数据库(liquibase“上下文”对于管理测试/开发数据非常有帮助)。

    当您从开发转到 QA 和生产时,您通常不必处理相同级别的分支更改,因此您希望回滚的 changeSet 与更改日志中的内容之间通常没有区别。

    【讨论】:

    • 这是有道理的。我认为这将是一个极端情况,正是你所说的原因。我想我可以建议人们在分支开关之间进行标记和回滚,如果他们真的担心的话。老实说,我认为您可以考虑将回滚存储在更改日志表中。我同意大小是一个问题,但现在大多数数据库都解决了这个问题。而且您始终可以将其设为可选(类似于将来回滚生成 SQL 脚本,允许其写入数据库),如果您确实想重新生成它,您还可以轻松地提供忽略数据库中的回滚信息的选项。我知道...欢迎使用补丁 8)
    • 我今天也在和其他人交谈,当更改日志文件不时被删除时,存储 changeSet 对 dbdoc 很有帮助。绝对是我会考虑在即将发布的版本中使用的东西
    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2016-11-19
    相关资源
    最近更新 更多