Liquibase配置failOnError:false、runAlways:false不生效问题咨询
问题根因说明
Liquibase默认仅在变更集完全执行成功时才会向DATABASECHANGELOG表插入执行记录,你配置的failOnError: false仅作用于流程层面:避免变更集执行失败时直接中断整个部署流程,不会为失败的变更集生成执行记录,因此runAlways: false的去重逻辑无法生效。
排查与解决步骤
- 第一步:确认变更集唯一标识配置正确
每个变更集的id、author、changelog文件路径共同组成唯一标识,标识变动会被Liquibase识别为新变更集。如果使用SQL格式的changelog,需确保头部注释格式符合规范,示例如下:--liquibase formatted sql --changeset your_name:20240520001 failOnError:false runAlways:false - 第二步:手动标记历史失败变更集
对于已经执行失败的变更集,可以手动向DATABASECHANGELOG表插入一条记录,将EXECTYPE设为MARK_RAN即可让后续执行跳过该变更集,参考插入语句(按需替换对应字段值):
高版本Liquibase支持MD5SUM字段填NULL,低版本需要生成对应变更集的MD5值填入即可。INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, DESCRIPTION, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('20240520001', 'your_name', 'changelog/your_target_sql.sql', NOW(), (SELECT MAX(ORDEREXECUTED) FROM DATABASECHANGELOG) + 1, NULL, 'sql', '手动标记失败变更集为已跳过', 'MARK_RAN', NULL, NULL, '你当前使用的Liquibase版本', (SELECT MAX(DEPLOYMENT_ID) FROM DATABASECHANGELOG)); - 第三步:配置自动标记规则避免后续出现同类问题
新增onFail: MARK_RAN属性到变更集配置中,该属性会在变更集执行失败时自动插入MARK_RAN状态的记录到日志表,后续不再重复执行该变更集。
SQL格式changelog配置示例:
YAML格式changelog配置示例:--changeset your_name:20240520001 failOnError:false onFail:MARK_RANdatabaseChangeLog: - changeSet: id: 20240520001 author: your_name failOnError: false onFail: MARK_RAN changes: - sqlFile: path: your_sql_file_path.sql - 第四步:验证配置生效
执行Liquibase更新命令后查看DATABASECHANGELOG表对应变更集的EXECTYPE字段,值为MARK_RAN或EXECUTED即代表配置生效,后续执行不会重复处理该变更集。
注意事项
不要随意修改已经提交过的变更集内容,否则MD5校验不通过会触发重新执行,若需要调整逻辑建议新建变更集处理。
onFail: MARK_RAN仅做跳过执行处理,若变更集对应逻辑是业务必需的,建议先修复SQL问题后删除对应MARK_RAN记录重新执行,避免业务逻辑缺失。
内容的提问来源于stack exchange,提问作者viglu
相关产品推荐
相关产品推荐

