Spring Boot升级引发Liquibase重复执行已执行文件问题求助
解决Liquibase升级后MD5Sum不一致导致变更重复执行的问题
针对Spring Boot从2.1.6升级到2.7.18(连带Liquibase从3.6.3到4.9.1)后出现的已执行变更重复执行问题,核心原因是Liquibase版本升级后MD5校验和的计算逻辑发生了变化,以下是几种可行的解决方法:
方法1:手动更新数据库中的MD5Sum值
- 先通过Liquibase命令计算当前变更文件的新版本MD5值:
liquibase calculateCheckSum --changeLogFile=path/to/your/changelog.xml - 找到数据库中的
DATABASECHANGELOG表,定位到对应变更记录,将MD5SUM字段的值替换为上面命令输出的新MD5值。注意:操作前务必备份数据库,避免数据损坏。
方法2:使用clearCheckSums命令自动更新
Liquibase提供了内置命令可以重新计算所有已执行变更的校验和并同步到数据库,无需手动修改:
liquibase clearCheckSums --changeLogFile=path/to/your/changelog.xml
执行前请确保应用处于停止状态,防止并发操作引发异常。
方法3:为变更集添加validCheckSum属性
如果不想修改数据库,可以直接在变更文件的对应<changeSet>标签中添加validCheckSum属性,指定旧版本生成的MD5值,让新版本Liquibase认可该校验和的有效性:
<changeSet id="your-change-id" author="your-name" validCheckSum="旧版本的MD5值"> <!-- 变更内容 --> </changeSet>
也可以同时指定多个校验和,兼容新旧版本:
<changeSet id="your-change-id" author="your-name" validCheckSum="旧MD5值, 新MD5值"> <!-- 变更内容 --> </changeSet>
方法4:统一变更文件的格式
部分情况下,Liquibase新版本对XML文件的空格、换行、注释等格式的处理逻辑改变,导致MD5计算差异。可以清理变更文件中的多余空格、注释,统一格式后重新生成校验和,确保新旧版本基于相同内容计算MD5。
内容的提问来源于stack exchange,提问作者jeevitesh
相关产品推荐
相关产品推荐

