【问题标题】:Liquibase changesets can not be rerunLiquibase 变更集无法重新运行
【发布时间】:2021-11-19 23:28:54
【问题描述】:

我们的 Liquibase 脚本无法重新运行,因为基础列已经消失了

考虑以下变更集:

  1. 创建了一个表“foo”,并且“domain”是该表中的列之一;
  2. 约束(以索引的形式)放置在“域”列上;
  3. 列“domain”已从表“foo”中删除。

现在,当我们尝试重新运行所有 liquibase 脚本(在已经存在的数据库结构上)时,变更集 2 失败

[ERROR]      Reason: liquibase.exception.DatabaseException: ERROR: column "domain" named in key does not exist

都是因为实际数据库中的“域”列在变更集 2 运行之前已经消失。

除了重新创建表中的“域”列以便所有 3 个变更集都可以运行之外,还有什么更好的方法可以使这些变更集可运行?

  • 系统中除了以上 2 个变更集外,还有数百个变更集;
  • 强烈建议该解决方案避免任何手动步骤,因为有许多环境必须重新运行变更集;
  • 在理想情况下,开发人员会在变更集 2 上放置 preConditions 以检查不仅缺少索引,而且基础列是否存在,但我们必须处理我们拥有的内容.据我了解,在 liquibase 中强烈建议不要重写现有的变更集。

【问题讨论】:

  • 问题是为什么你需要重新运行每个changeset?即使数据库已经与所有更改保持同步!
  • @ray 我们的特殊问题是在我们的一组环境中,liquibase 脚本从错误的目录运行。现在,当我们尝试将它们移动到正确的目录时,liquibase 运行失败,因为文件移动到另一个目录被视为更改。因此,我们决定重新运行新(实际上是旧)目录中的所有 liquibase 脚本。

标签: postgresql liquibase


【解决方案1】:

根据评论,您的问题是更改liquibase 脚本目录位置。

实际发生的是liquibase 在您的脚本中执行这些changesets 时会比较liquibase 脚本的相对路径。您可以在databasechangelog 表和filename 列下找到此相对路径。

首先你应该明白问题不在于checksum。所以它不会解决你的问题。

您可以做的最简单的事情是更改表databasechangelogfilename 列中的值。如果您有多个liquibase 脚本文件,建议您一一更改。像这样简单的 sql 查询就可以完成这项工作。

update databasechangelog set filename='<new_filename>' where filename='<old_filename>'

注意:如果你做错了,可能会使情况变得更糟。确保在进行任何更改之前仔细检查所有内容。

【讨论】:

  • 谢谢!我认为“更新数据库更改日志”是一种最好避免的 hack(正如我所提到的,我们有数百个变更集和数十个环境),但在这里可能是一个较小的邪恶。
  • 嗯,这是一种说法。我个人认为,如果您知道自己在做什么,那将不是问题。是的,工作量很大,我同意你的看法。但与更改所有 changesets 相比,它要少得多。
【解决方案2】:

您始终可以向 changeSets #2 和 #3 添加前置条件以检查 domain 列是否存在,例如:

    <preConditions onFail="MARK_RAN">
        <columnExists tableName="foo" columnName="domain"/>
    </preConditions>

如果这些 changeSets 将开始失败并出现“不同的校验和错误”,那么您可以随时提供新的校验和或添加 &lt;validCheckSum&gt;ANY&lt;/validCheckSum&gt;。 这样您就可以在您需要的所有环境中运行这些变更集。

不鼓励重写变更集,但鼓励为变更集编写前置条件。

【讨论】:

  • 谢谢!这是我们可以做的事情。只有当我们转到“ANY”时——我们才能返回?
  • 返回什么? “ANY”表示 liqubiase 不会检查 chengeSet 的校验和,因此如果您的变更集更改(不鼓励),liquibase 不会注意到这一点。但是如果你只添加前置条件,那么变更集的校验和不会改变,所以应该不是问题
  • 我的意思是,添加/删除 ANY 会再次更改校验和吗?如果是这样,那么一旦我们添加了这个属性,它就永远不能被删除,根据我的理解。
  • 不,指定validCheckSum 不会改变校验和
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 2015-11-25
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多