添加新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:1changeset中添加validCheckSum属性,指定允许的校验和值:-- 在author:1的changeset开头添加示例 -- validCheckSum: 旧校验和值, 新校验和值 - 此方式易留下维护隐患,除非完全清楚风险,否则不建议常规使用。
内容的提问来源于stack exchange,提问作者Manjunath
相关产品推荐
相关产品推荐

