从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
相关产品推荐
相关产品推荐

