【问题标题】:Better understanding how Liquibase execute change sets更好地理解 Liquibase 如何执行变更集
【发布时间】:2014-02-24 23:25:12
【问题描述】:

我想更好地了解 Liquibase 如何执行变更集。

1)

a) 例如,我有一个包含 4 个更改集的更改日志,我执行 updateDatabase (http://www.liquibase.org/documentation/ant/updatedatabase_ant_task.html)。 Liquibase 将执行 4 个变更集。

b) 如果我再次运行相同的更改日志,Liquibase 不会执行任何设置。

c) 如果我将新的更改集添加到更改日志并运行更改日志,Liquibase 将只执行新的更改集。

问题:

  • Liquibase 如何知道要执行哪些更改集?

  • Liquibase 如何知道哪些变更集已经执行?

2) 变更集 ID 有多重要?我可以在更改日志执行后更改它吗?

3) 变更集作者有多重要?我可以在更改日志执行后更改它吗?

4) 如果我执行 rollbackDatabase (http://www.liquibase.org/documentation/ant/rollbackdatabase_ant_task.html) 会发生什么? Liquibase 如何知道要回滚的更改集?

a) 如果我在 1 a) 之后执行回滚会发生什么。 Liquibase 会调用位于每个更改集中的回滚元素(4 个回滚元素)吗?

b) 如果我在 1 b) 之后执行回滚会发生什么。 Liquibase 如何知道不调用任何回滚元素?

c) 如果我在 1 c) 之后执行回滚会发生什么。 Liquibase 会仅调用新更改集的回滚元素吗?

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    我可以回答几个问题,但也许不是全部。

    1. c。 - 当您进行第一次更新时,Liquibase 会在数据库中创建 2 个新表。主表是 DATABASECHANGELOG,用于跟踪哪些更改集已应用于数据库。 Liquibase 使用几种方法来识别每个变更集 - id、作者和路径用作复合键。 Liquibase 还生成每个变更集的校验和,用于判断变更集在应用于数据库后是否已更改。

    2. 和 3. 由于更改集 id 和作者被用作主键的一部分,如果您部署,然后更改其中任何一个,您可能会在后续部署中遇到意外行为。我认为 id 和 author 也是校验和计算的一部分,所以这也可能会影响事情。我建议您在部署后不要更改它们。

    3. 回滚使用相同的机制来了解要回滚的更改集。当您回滚时,您必须以某种方式指定要撤消的更改 - 请参阅此页面了解更多信息:http://www.liquibase.org/documentation/rollback.html

    回滚识别机制是按标签(这意味着您必须在部署时应用标签)、按日期(Liquibase 跟踪每个变更集的部署时间)或按数字(隐式使用日期/时间)每个变更集都已部署)。

    【讨论】:

    • 谢谢! Liquibase 创建的第二个表是什么?另外,你能回答这个问题吗? stackoverflow.com/questions/21847482/…
    • 第二个是DATABASECHANGELOGLOCK表,只是用来保证对DATABASECHANGELOG的操作成功完成。基本上,对于每次应用的更改,liquibase 都会获取锁,进行更改,然后释放锁。
    • DATABASECHANGELOGLOCK 用于确保在多台机器共享同一个数据库的分布式环境中,只有一台机器同时尝试更新数据库。
    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2023-04-02
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多