Liquibase Bean创建失败:变更集校验和不匹配问题求助
Liquibase变更集校验和不匹配问题修复
问题说明
关闭项目重新打开后,启动时出现Liquibase校验验证失败,具体错误为变更集的MD5校验和不匹配:
1个变更集校验和不匹配
db/changelog/0.0.1/changelog-create-identity-schema.sql::add-user_accounts_roles-table-constrains::OrestHutovych原本为:9:8df671e96368d2e485f0166207cc5e73,现在变为:9:08a7c0401b617afbb4e89a5b2843b6e0
完整报错栈如下:
org.springframework.beans.factory.BeanCreationException: 创建类路径资源[org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]中定义的名为'liquibase'的Bean失败:liquibase.exception.ValidationFailedException: 验证失败: 1个变更集校验和不匹配 db/changelog/0.0.1/changelog-create-identity-schema.sql::add-user_accounts_roles-table-constrains::OrestHutovych原本为:9:8df671e96368d2e485f0166207cc5e73,现在变为:9:08a7c0401b617afbb4e89a5b2843b6e0 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1773) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:312) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1231) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:949) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) ~[spring-context-6.1.3.jar:6.1.3] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.2.jar:3.2.2] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.2.jar:3.2.2] at com.example.twitterdemo.TwitterDemoApplication.main(TwitterDemoApplication.java:10) ~[classes/:na] Caused by: liquibase.exception.CommandExecutionException: liquibase.exception.ValidationFailedException: 验证失败: 1个变更集校验和不匹配 db/changelog/0.0.1/changelog-create-identity-schema.sql::add-user_accounts_roles-table-constrains::OrestHutovych原本为:9:8df671e96368d2e485f0166207cc5e73,现在变为:9:08a7c0401b617afbb4e89a5b2843b6e0 at liquibase.command.CommandScope.execute(CommandScope.java:237) ~[liquibase-core-4.24.0.jar:na] at liquibase.Liquibase.lambda$update$0(Liquibase.java:222) ~[liquibase-core-4.24.0.jar:na] at liquibase.Scope.lambda$child$0(Scope.java:184) ~[liquibase-core-4.24.0.jar:na] at liquibase.Scope.child(Scope.java:193) ~[liquibase-core-4.24.0.jar:na] at liquibase.Scope.child(Scope.java:183) ~[liquibase-core-4.24.0.jar:na] at liquibase.Scope.child(Scope.java:162) ~[liquibase-core-4.24.0.jar:na] at liquibase.Liquibase.runInScope(Liquibase.java:1371) ~[liquibase-core-4.24.0.jar:na] at liquibase.Liquibase.update(Liquibase.java:211) ~[liquibase-core-4.24.0.jar:na] at liquibase.Liquibase.update(Liquibase.java:193) ~[liquibase-core-4.24.0.jar:na] at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:331) ~[liquibase-core-4.24.0.jar:na] at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:286) ~[liquibase-core-4.24.0.jar:na] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1820) ~[spring-beans-6.1.3.jar:6.1.3] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1769) ~[spring-beans-6.1.3.jar:6.1.3] ... 18 common frames omitted Caused by: liquibase.exception.ValidationFailedException: 验证失败: 1个变更集校验和不匹配 db/changelog/0.0.1/changelog-create-identity-schema.sql::add-user_accounts_roles-table-constrains::OrestHutovych原本为:9:8df671e96368d2e485f0166207cc5e73,现在变为:9:08a7c0401b617afbb4e89a5b2843b6e0 at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:353) ~[liquibase-core-4.24.0.jar:na] at liquibase.command.core.helpers.DatabaseChangelogCommandStep.run(DatabaseChangelogCommandStep.java:92) ~[liquibase-core-4.24.0.jar:na] at liquibase.command.CommandScope.execute(CommandScope.java:214) ~[liquibase-core-4.24.0.jar:na] ... 30 common frames omitted
修复步骤
1. 排查变更集文件变化
先检查db/changelog/0.0.1/changelog-create-identity-schema.sql文件:
- 查看是否有换行符格式变化(Windows的CRLF和Linux的LF会导致校验和不同)
- 检查是否有空格、注释的增减
- 确认SQL语句是否被修改
2. 合理修改后的校验和更新
如果文件修改是有意且合理的,用以下方式更新校验和:
- 直接修改数据库:找到数据库中的
databasechangelog表,定位到对应变更集的记录,将MD5SUM字段的值改为新的校验和9:08a7c0401b617afbb4e89a5b2843b6e0 - 使用Liquibase命令:在项目根目录执行命令:
liquibase clearCheckSums
重启项目后,Liquibase会自动重新计算并更新数据库中的校验和。
3. 误修改的回滚处理
如果文件是被误修改,直接恢复到之前的版本,重启项目即可,校验和会自动匹配。
4. 测试环境临时跳过校验(不推荐生产使用)
开发测试环境中,若想快速跳过验证,可在配置文件中添加:
- properties格式:
spring.liquibase.validation-mode=none
- yml格式:
spring: liquibase: validation-mode: none
注意:生产环境禁止使用此配置,会破坏数据库变更的一致性校验机制。
内容的提问来源于stack exchange,提问作者Orest Hutovych
相关产品推荐
相关产品推荐

