You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加新Changeset至已有SQL文件时Liquibase校验失败求助

Liquibase校验和不匹配问题:操作正确性与解决方案

操作方式是否正确?

直接在已执行过的SQL迁移文件中新增changeset的操作完全错误。

原因很明确:Liquibase会为每个已执行的changeset计算校验和(基于文件内容),并将该值存储在数据库的DATABASECHANGELOG表中。当你修改了包含已执行changeset的文件——哪怕只是在文件末尾新增其他changeset——Liquibase重新计算原changeset的校验和时,会与数据库中存储的旧值不一致,从而触发校验和不匹配错误。

解决方案

1. 正确的迁移文件管理规范(从根源避免问题)

  • 绝对不要修改已经执行过的迁移文件,包括在其中新增新的changeset。
  • 新增数据库变更时,创建全新的SQL迁移文件,例如命名为changelog-v2.sql,在其中编写changeset author:2的内容。
  • 执行新的迁移文件,Liquibase会自动识别未执行的changeset并执行,不会触发校验和问题。

2. 修复当前的校验和不匹配错误

如果已经出现错误,可通过以下方式处理:

方法一:删除旧changeset记录(推荐)

  • 登录数据库,找到DATABASECHANGELOG表,删除author:1对应的行记录。
  • 注意:此操作会让Liquibase认为该changeset从未执行过,重新执行迁移时会再次运行author:1的SQL。请确保你的SQL是幂等的(例如使用CREATE TABLE IF NOT EXISTS、ALTER TABLE ... ADD COLUMN IF NOT EXISTS),避免重复执行导致报错。
  • 重新执行Liquibase迁移,此时Liquibase会重新计算author:1的校验和并存储,同时执行新增的author:2。

方法二:用Liquibase命令重置校验和

  • 在Docker容器中执行Liquibase的clearCheckSums命令,清空所有已执行changeset的校验和记录:
    liquibase clearCheckSums
    
  • 重新执行迁移命令,Liquibase会重新计算所有已执行changeset的校验和并更新到数据库,同时执行新的author:2。
  • 提示:此方式会重置所有校验和,适用于确认所有已执行的changeset内容均正确且无需调整的场景。

方法三:标记校验和为合法(不推荐,仅应急)

  • 如果author:1的SQL已正确执行,不想再次运行,可选择两种方式:一是直接在DATABASECHANGELOG表中更新author:1记录的校验和为当前文件计算出的值;二是在原SQL文件的author:1 changeset中添加validCheckSum属性,指定允许的校验和值:
    -- 在author:1的changeset开头添加示例
    -- validCheckSum: 旧校验和值, 新校验和值
    
  • 此方式易留下维护隐患,除非完全清楚风险,否则不建议常规使用。

内容的提问来源于stack exchange,提问作者Manjunath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:35:08