【问题标题】:run liquibase on multiple databases at different versions在不同版本的多个数据库上运行 liquibase
【发布时间】:2014-02-12 14:08:03
【问题描述】:

我正在尝试将 Liquibase 与我们的 Spring/Hibernate 网络应用程序集成,以取代我们现有的本土解决方案。到目前为止,Liquibase 很棒,但有一个用例对我们很重要,我不知道 Liquibase 是否支持它,就是这样:

我们将我们的网络应用程序部署到自己托管网络应用程序和数据库 (MySQL) 的客户。因此,假设我们使用新的干净 DB 模式(从 Hibernate 映射生成)部署到我们的第一个客户端(client1),并且 Liquibase 变更集中没有项目。然后我们开发一些模式更改并将应用程序重新部署到 client1,然后 liquibase 完成它的工作并应用更改集——到目前为止一切都很好。

现在,我们再次使用从 Hibernate 映射生成的新数据库模式部署到新客户端 client2。但是这一次,存在变更集(对于 client1 和 client2 部署之间所做的更改),但不需要应用它们,因为它们已经在新模式中)。但是,由于 DATABASECHANGELOG 表是空的,Liquibase 将尝试应用变更集,并且可能会因 SQL 错误而失败。 我们希望新客户端的新部署能够“了解”它们是什么变更集(相对于客户端 1 的第一次部署),因此它只应用后续更新。

这似乎有几种可能性,可能更多的是我没有想到的:

  • 用虚假条目填充 DATABASECHANGELOG 以欺骗 Liquibase 以为这些条目已被应用。

  • 始终将我们的第一个基线原始架构部署到后续客户端,并按顺序运行更新,因此永远不要在客户端 1 之后部署从 Hibernate 映射派生的“新”架构。

  • 使用我们自己的跟踪系统(例如,将数据库版本映射到应用程序版本,将数据库版本映射到变更集)。

这是一个问题,还是我只是不明白如何正确使用 Liquibase?非常感谢以前处理过此类用例的人的任何建议。如果可能的话,我们真的很想避免特定于部署的变更集 - 将有几十个,如果不是数百个部署要处理。

谢谢, 理查德

【问题讨论】:

    标签: database liquibase


    【解决方案1】:

    我们有类似的设置。 但我们更早地将 liquibase 加入到游戏中。在正式发布软件之前,我们设置了 liquibase 变更集并让 liquibase 处理数据库。

    我们不想失去在开发阶段让 hibernate 生成数据库的优势。所以我们在开发的时候也在使用Hibernate。

    但在版本稳定之前,我们让 liquibase diff 工具在数据库上运行,并让它为 hibernate 生成的表创建一个变更集。 然后手动更正此变更集,因为 liquibase diff 工具确实会产生一些缺陷。

    一旦变更集准备就绪,我们就会将其与软件一起发布。

    我们维护一个参考系统,该系统保存最后一个正式发布版本的数据库版本。然后在下一个版本中,我们让 liquibase diff 工具在当前开发版本中针对参考数据库运行。这说明了下一个版本的不同之处。这也是手动更正的,最后你有一个将数据库更改为下一个版本的变更集。

    希望这能让您了解一起使用 liquibase 和 hibernate 的一种方法。

    【讨论】:

    • 感谢您的建议 - 我们已经建立了第二个开发数据库,​​我们可以使用它来比较休眠生成的表并在提交之前测试 liquibase 更新,我们会看到它是如何工作的......
    【解决方案2】:

    我通常建议始终对所有不同的数据库运行相同的更改日志文件。这样您就不必手动将 changeSets 标记为已运行、使用前提条件或其他任何事情。最重要的是,每个数据库都将遵循相同的升级路径,因此您知道它们会持续更新而不会出现任何意外问题。

    您可以使用liquibase hibernate extension 根据您的 hibernate 映射自动将 changeSets 附加到您的 changelog 中,但是当需要将您的更改部署到数据库时,您只需运行您的 liquibase changelog 文件,而不是尝试使用 hibernate 的架构生成完全符合逻辑。

    【讨论】:

      【解决方案3】:

      对于上面的选项 1(填充虚假条目),我刚刚发现了 changelogSync 命令,它看起来像是将所有变更集条目标记为已应用,即使它们尚未应用。

      但这比从基线架构真正应用更改好还是坏?

      【讨论】:

        猜你喜欢
        • 2017-08-27
        • 2014-10-11
        • 2017-09-22
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        • 2014-08-12
        相关资源
        最近更新 更多