数据库迁移:单个创建脚本与更改集

时间:2014-05-20 10:33:06

标签: data-migration liquibase

我正在为每个客户创建一个数据库架构。因此,每当新客户注册时,我需要在运行时快速创建其架构。

选项1

在运行时,使用Liquibase(或等效的)运行所有变更集以生成最新的模式。

缺点:

  • 这很慢,可能有多个历史变更集现在不再相关了(创建表格和年份后再删除它)。
  • Liquibase在运行时使用,而不仅仅是“迁移时间”。不确定这是不是一个好主意。
  • 将Liquibase作为创建架构的意思,将迫使所有开发人员在开发过程中使用它。我们尽量避免在开发人员上加载更多工具。

选项2

在每次构建之后,我们使用Liquibase变更集生成临时数据库。然后从数据库中我们基于当前快照创建一个干净的模式创建脚本。然后,当新客户到来时,我们只运行干净的脚本,而不是完整的更改集历史记录。

缺点:

  • 下次运行liquibase时,它会尝试从changeset 1运行。解决方法可能是在生成脚本中包含changeset表的创建并向其插入最新的变更集。
  • 使用一个脚本创建新模式,而旧模式则通过变更集过程。从理论上讲,这可能会导致不同的架构。但是,单个脚本也经历了变更集过程,因此我无法想到会导致错误的确切情况,这是现在的理论问题。

您怎么看?

2 个答案:

答案 0 :(得分:1)

我会建议选项#1的一致性。

数据库更新可能很复杂,变异的可能性越小越好。这意味着您应该让开发人员最初创建liquibase changeSets来更新他们的数据库,因为他们正在实现新功能以了解他们正在按预期运行,然后知道这些相同的步骤将在QA中一直运行到生产中。它是一个他们需要处理的额外工具,但它应该很容易以易于使用的方式集成到他们的标准工作流中。

同样,我通常建议在changeLog中保留不相关的历史更改集,因为如果删除它们,则会偏离已知良好的更新路径。数据库在大多数操作中都很快,尤其是在几乎没有数据的系统上。如果您有不再需要的特定更改工具并且由于某种原因而过于昂贵,您可以根据具体情况将其删除,但我建议您很少这样做。

您是正确的,从liquibase脚本创建数据库快照应该与运行changeLog相同 - 只要在快照中包含databasechangelog表即可。但是,坚持使用实际的Liquibase更新一直到生产将允许您使用可能对您的情况有帮助的上下文,前置条件和更改日志参数等功能。

答案 1 :(得分:0)

数据库部署有两种方法:

  1. 构建一次部署许多 - 此方法使用与本机代码相同的原则,编译一次并在环境中复制二进制文件。从数据库的角度来看,这种方法意味着部署脚本只生成一次,然后跨环境执行。

  2. Build&按需部署 - 此方法在需要时生成增量脚本,以便处理任何进程外更改。

  3. 如果你使用Build&按需部署方法,您可以为整个架构或工作项/变更集生成增量脚本。