Weblogic启动报错“Expected single row from liquibase.statement.core.SelectFromDatabaseChangeLogLockState”
一根不剩 2024-08-15 13:03:05 阅读 68
一、背景:
本地测试环境数据库模拟生产恢复之后启动报错
二、报错日志:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping]: Factory method 'endpointHandlerMapping' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcEndpoints' defined in class path resource [org/springframework/boot/actuate/autoconfigure/EndpointWebMvcManagementContextConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'liquibaseEndpoint' defined in class path resource [org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration$LiquibaseEndpointConfiguration.class]: Unsatisfied dependency expressed through method 'liquibaseEndpoint' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [com/ideatech/common/config/LiquibaseConfig.class]: Invocation of init method failed; nested exception is liquibase.exception.LockException: liquibase.exception.DatabaseException: Expected single row from liquibase.statement.core.SelectFromDatabaseChangeLogLockStatement@1ae82a09 but got 2
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
... 116 common frames omitted
三、排查原因:(略过原因直接看解决方法的直接下一步)
这个异常信息表明在 Spring Boot 应用程序启动时出现了问题,具体涉及到 Spring Boot Actuator 的端点配置以及 Liquibase 的初始化过程。
让我们逐步分析这个异常的主要问题和可能的解决方法:
异常根本原因是 liquibase.exception.LockException,提示 Liquibase 在执行数据库变更时出现了锁定问题。
异常链分析:
BeanInstantiationException:Spring 在实例化 EndpointHandlerMapping 过程中失败。
BeanCreationException:Spring 创建 mvcEndpoints bean 时发生了错误。
UnsatisfiedDependencyException:在创建 liquibaseEndpoint bean 时,依赖的 liquibase bean 初始化失败。
LockException:由 Liquibase 抛出的异常,指示数据库锁定问题。
DatabaseException:Liquibase 在执行数据库操作时遇到了问题。
具体错误:
Expected single row but got 2:Liquibase 在查询 DATABASECHANGELOGLOCK 表时预期返回一行,但实际返回了两行。这通常意味着多个 Liquibase 实例或者不同的线程尝试同时访问数据库变更日志表。
可能的解决方法:
确保唯一的 Liquibase 实例:确保你的应用程序只有一个 Liquibase 实例在执行数据库迁移。可能存在多个应用实例同时运行或者同一实例的多个 Liquibase 实例在操作数据库。
检查数据库状态:检查数据库中 DATABASECHANGELOGLOCK 表的状态,确保没有未释放的锁定。你可以手动检查数据库表,并清理掉多余的锁定行。
排查并发问题:检查应用程序的部署环境,确保不会出现并发启动多个 Liquibase 实例的情况。
使用数据库管理工具:可以使用数据库管理工具(如 SQL Developer、pgAdmin、MySQL Workbench 等)直接操作数据库表,查看和清理 DATABASECHANGELOGLOCK 表。
Spring Boot Actuator 配置调整:在某些情况下,可能需要调整 Spring Boot Actuator 的配置,以确保端点的正确初始化。但通常情况下,问题主要集中在 Liquibase 的数据库锁定问题上。
重新启动应用程序:
在清理了数据库锁定问题后,重新启动应用程序,看看问题是否解决。
通过理解并解决 DATABASECHANGELOGLOCK 表中的行数异常,应该能够解决这个 BeanInstantiationException 的根本问题
四、解决
1、原因
经排查确认数据库中系统表DATABASECHANCELOGLOOK为两条数据,删掉一条即可
删掉重启即可解决,但此时删除报错了😅
请看jpg(原因:ORA-01502 错误表示一个索引处于不可用状态)
2、检查索引状态:
SELECT index_name,status,owner FROM all_indexes WHERE index_name = 'PK_DATABASECHANCELOGLOOK';
如果STATUS列显示为UNUSABLE,则表示索引不可用。
3、重新构建索引:
ALTER INDEX 'PK_DATABASECHANCELOGLOOK REBUILD;
这将重新构建索引,使其恢复正常状态。
上一篇: 159、Rust与WebAssembly:打造高性能Web应用的新选择
下一篇: 02 Datax-web+Datax搭建企业级数据同步中心平台教程
本文标签
Weblogic启动报错“Expected single row from liquibase.statement.core.SelectFromDatabaseChangeLogLockState”
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。