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

从Liquibase 3.5.3迁移至4.8.0导致databasechangelog的md5sum列设为NULL

Liquibase 3.5.3 → 4.x 迁移后旧条目md5sum为NULL的解决办法
  • 问题核心:Liquibase 4.x对md5sum的计算逻辑做了调整(新增算法版本前缀,比如8:),默认情况下update操作不会自动重新计算3.x版本生成的旧changeSet条目md5sum,仅处理新执行的changeSet。

可行解决思路

1. 强制在update时重新校验所有md5sum

调用update方法前,开启强制更新旧条目校验值的配置:

// 配置强制更新所有checksum
LiquibaseConfiguration.getInstance()
    .getConfiguration(UpdateCommandConfiguration.class)
    .setChecksums(true);

// 执行update操作
liquibase.update(contexts, labelExpression);

也可以在应用启动时添加系统属性:-Dliquibase.update.checksums=true

2. 手动触发旧条目checksum计算

若上述配置不生效,可单独调用API重新计算所有md5sum为NULL的旧条目:

// 获取已执行的changeSet列表
List<RanChangeSet> ranChangeSets = liquibase.getDatabase().getRanChangeSetList();
for (RanChangeSet ranChangeSet : ranChangeSets) {
    if (ranChangeSet.getMd5Sum() == null) {
        // 加载对应的changeSet定义
        ChangeSet changeSet = liquibase.getDatabaseChangeLog().getChangeSet(
            ranChangeSet.getId(),
            ranChangeSet.getAuthor(),
            ranChangeSet.getFilePath()
        );
        if (changeSet != null) {
            // 计算并更新md5sum
            String newMd5Sum = liquibase.calculateChecksum(changeSet);
            ranChangeSet.setMd5Sum(newMd5Sum);
            liquibase.getDatabase().getRanChangeSetList().update(ranChangeSet);
        }
    }
}

3. 检查databasechangelog表结构

确认md5sum列长度足够存储4.x格式的校验值(至少VARCHAR(64))。Liquibase通常会自动升级表结构,但如果有自定义修改,可手动调整:

ALTER TABLE databasechangelog ALTER COLUMN md5sum TYPE VARCHAR(64);

注意事项

  • 不要直接手动修改md5sum值,避免校验不匹配导致后续迁移报错
  • 升级到4.9.0后问题仍存在,是因为默认行为未改变,需显式开启校验更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:57:36