数据库升级后得到 liquibase 校验和验证错误

Posted

技术标签:

【中文标题】数据库升级后得到 liquibase 校验和验证错误【英文标题】:After db upgrade getting liquibase checksum validation error 【发布时间】:2020-03-30 11:15:57 【问题描述】:

我将我的 PostgreSQL 从版本 9.6 升级到 12,并且我正在通过 Spring 使用 Liquibase 3.8.0。

在启动应用程序时进行数据库升级后,第一个变更集出现以下 Liquibase 异常:

Caused by: liquibase.exception.ValidationFailedException: Validation Failed:
     1 change sets check sum
          db.liq.xml::1555784288321-4::myuser was: 8:9df75f119833ded8765efcc910ffa071 but is now: 8:57040acff0d316c100c788531a84ae8b

现在当前的变更集是用onValidationFail="MARK_RAN" 标签设置的,所以它不应该失败,但我仍然得到这个异常..

 <changeSet author="myuser" id="1555784288321-4" onValidationFail="MARK_RAN">

我可以通过设置&lt;validCheckSum&gt; 标记来解决这个特定的异常,但我认为对于其他变更集我会得到相同的异常。 我唯一做的就是升级我的 Postgres 数据库。

现在,liquibase 是否使用数据库的函数哈希?如果是,那么它可以解释这种行为,但在每次重大升级或每次数据库更新其哈希函数时,Liquibase 的行为似乎不太可能。

【问题讨论】:

没有。 Liquibase 使用内部校验和功能。您是否也升级了 Liquibase? 不,我没有升级 liquibase。正如你所说,liquibase 将使用内部校验和更合理.. 我读到了 clearCheckSums 方法,它应该重新计算校验和但不应该部署旧的变更集。这是一个安全的动作吗?我不想再次运行变更集.. 旁注 - 当变更集上的 dbms 属性与当前数据库不匹配时,onValidationFail 属性控制 Liquibase 在更新期间的操作。我注意到 Liquibase 文档中缺少此内容。在旧论坛帖子中找到它。 forum.liquibase.org/topic/… 【参考方案1】:

您始终可以使用clearCheckSums 功能。它将清除现有的校验和并重新计算它们,而无需运行您的变更集。

为了运行clearCheckSums,您可以使用maven 目标:

https://www.liquibase.org/documentation/maven/maven_clearchecksums.html

或 Liquibase 命令行:

https://www.liquibase.org/documentation/command_line.html

另一种选择(不好的):

您可以将&lt;validCheckSum&gt;ANY&lt;/validCheckSum&gt; 添加到您的变更集中。

它会解决问题,但您将无法控制已执行的变更集中的变更。所以这是一件好事。

【讨论】:

@JeyJ 我想这是你最好的选择。 我尝试添加 validCheckSum 标记以查看它是否只有 1 个变更集。如果它不起作用,我会接受你的建议:) 我已经更新了我的答案。添加 validCheckSum 不是一个好习惯。您将禁用由 Liquibase 完成的 changeSet 完整性检查 这意味着如果您要更改该变更集 -> liquibase 将计算不同的 md5sum -> 由于验证标签,liquibase 不会应用更改? 是的,在这种情况下 liquibase 不会应用更改

以上是关于数据库升级后得到 liquibase 校验和验证错误的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase - 校验和因不同的数据库供应商而异

Hex文件校验生成和验证

客户端传入数据的校验-RestController进阶

Liquibase 了解

Liquibase使用小结

iOS 应用上传警告:校验和验证失败