在不同版本的多个数据库上运行liquibase

时间:2014-01-22 13:28:54

标签: database liquibase

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

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

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

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

  • 使用虚假条目填充DATABASECHANGELOG,以欺骗Liquibase认为已经应用了这些条目。

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

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

这是一个问题,还是我不理解如何正确使用Liquibase?非常感谢那些曾经处理过这种用例的人的建议。如果可能的话,我们真的希望避免特定于部署的changeSet - 如果不是数百个部署,将会有数十个部署。

谢谢,  理查德

3 个答案:

答案 0 :(得分:2)

我们有类似的设置。 但我们早些时候将liquibase加入游戏。在我们正式发布软件之前,我们设置liquibase changesets并让liquibase处理数据库。

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

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

变更集准备就绪后,我们随软件发送。

我们维护一个参考系统,保留上一个正式发布版本的数据库版本。然后,对于下一个版本,我们让liquibase diff工具使用当前开发版本针对参考db运行。这为下一个版本吐出了差异。这也是手动更正的,最后你有一个更改集,可以将db更改为下一个版本。

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

答案 1 :(得分:1)

我通常建议始终针对所有不同的数据库运行相同的changelog文件。这样您就不必处理手动将changeSets标记为已运行,使用前置条件或其他任何内容。最重要的是,每个数据库都将遵循相同的升级路径,因此您知道它们将始终如一地更新,而不会出现任何意外问题。

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

答案 2 :(得分:0)

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

但是,这比在基线架构中真正应用更改更好还是更差?