【问题标题】:Migrate LiquibaseChangeLog entries迁移 LiquibaseChangeLog 条目
【发布时间】:2014-11-08 13:48:58
【问题描述】:

我们正在使用 Liquibase 来处理我们的数据库架构更改。由于我们已经有相当多的 ChangeLogs 分布在多个文件中,并以复杂的文件夹结构排列,因此有时需要或希望进行一些重构,这些重构会影响 DatabaseChangeLog 表中的元信息。

对此类重构有什么建议?我可以使用 Liquibase 本身来更新 DatabaseChangeLog 条目还是会遇到缓存问题?

一个简单的例子让我的情况更清楚:

  • 我创建了一个新的 changeLog 文件 test/changeLog.xml,其中包含一些 changeSets 的默认logicalFilePath
  • 随着文件变大,我想将其拆分为多个文件,将它们移动到一些子文件夹中,并将logicalFilePath 属性显式设置为“myChanges”以对它们进行分组
    • 由于这些更改已经运行,我必须更新 DATABASECHANGELOG.FILENAME 字段,否则 Liquibase 会认为我引入了新的更改集
    • 我需要运行 UPDATE DATABASECHANGELOG set FILENAME='myChanges' WHERE FILENAME='test/changelog.xml'
  • 当然,我想以自动化的方式进行。最好的方法是什么?我可以使用 Liquibase 本身吗?或者在使用新结构运行 Liquibase 之前,我是否需要以其他方式(JDBC 或其他方式)更新 DATABASECHANGELOG?

感谢您的反馈!

一些跟进:

有时很遗憾,无法调整变更集。考虑以下情况:

  • 我们使用 VARCHAR2(255 字节)创建了一个新表
  • 一切正常,表已部署并填充了数据
  • 我引入了一个用于测试的嵌入式 H2 数据库,它无法理解“255 字节”,但只有 255。对于原始数据库,将其更改为 VARCHAR(255) 不会有任何影响,但会更改校验和变更集并导致 Liquibase 错误。
  • 删除并重新创建表格也不是一种选择,因为表格已经填充了数据
  • 使用普通的 Liquibase,我最终会得到一个解决方案,例如创建一个新表、移动我的数据、删除旧表并重命名新表...

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    Liquibase 不支持重构变更日志文件。它通常希望您在运行后保持原样,以最大程度地减少意外差异。

    如果您想四处移动,您概述的步骤就是您需要执行的操作。 LogicalFilePath 会有所帮助,您只需更新 databasechangelog.filename 列即可。

    在重新组织文件后第一次运行 liquibase 之前,您需要更新文件名路径,否则它将再次执行 changeSets。 Liquibase 在启动时会立即查看更改日志表和更改日志文件,因此您需要在 Liquibase 之外更新文件名列。

    【讨论】:

    • 嗨内森。感谢您的反馈意见!我在我的描述中添加了一个示例用例,以表明有时无法更改变更集是很不幸的(例如,如果它在语法上有所帮助,但实际上不会更改它已经运行的 DB 上的现有结构)。 2 个问题:我可以使用单独的 Liquibase 运行来更新 DatabaseChangeLog,或者如果 changeLog 在该表中乱七八糟,它会弄乱 Liquibase 吗?您如何看待 Liquibase 的扩展,例如 changeLog 属性“canReplaceChecksum=xyz”或用于适当用例的类似内容?
    • 有一个 标签,当您有意更改 changeSet 并希望将更改标记为 OK 时,您可以将其添加到您的 changeSets 中。我认为这与您的 canReplaceChecksum 相同
    • 应该有一个单独的 liqubase 运行来实际更新 changelog 表。 Liquibase 只是在开始时读取它,因此您在启动后执行的任何操作都应该没问题。
    • 酷,不知道 validCheckSum 标签。在forum.liquibase.org/topic/understanding-validchecksum 找到更多信息,这就是我的意思。我认为如果使用一些孤立的 changeSets 和其他方法(在运行实际的 changeLog 之前使用 Liquibase 更新 DatabaseChangeLog)可能有助于更大的迁移,例如大量文件的文件名,则该方法很有用。再次感谢您的反馈并继续努力!
    • @NathanVoxland,我不确定在阅读了你所有的 cmets 后我能得到你的答案。在答案中,您说更新logicalFilePath 和databasechangelog.filename 应该足够了,但是您指的是,这似乎是您的答案中缺少的另一个步骤。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 2020-11-13
    • 2020-02-23
    • 2021-06-29
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2022-06-21
    相关资源
    最近更新 更多