025-02-14 14:54:12.484 ERROR 30592 --- [ task-2] c.l.MultiTenantDataSourceSpringLiquibase : Liquibase could not start correctly, your database is NOT ready: Could not acquire change log lock. Currently locked by (192.168.2.167) since 2024-11-05, 11:21 a.m.
liquibase.exception.LockException: Could not acquire change log lock. Currently locked by (192.168.2.167) since 2024-11-05, 11:21 a.m.
at liquibase.lockservice.StandardLockService.waitForLock(StandardLockService.java:236)
at liquibase.Liquibase.update(Liquibase.java:184)
at liquibase.Liquibase.update(Liquibase.java:179)
at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:366)
at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:314)
at com.retinalabs.homecare.core.liquibase.MultiTenantDataSourceSpringLiquibase.initDb(MultiTenantDataSourceSpringLiquibase.java:134)
at com.retinalabs.homecare.core.liquibase.MultiTenantDataSourceSpringLiquibase.lambda$runOnAllDataSources$1(MultiTenantDataSourceSpringLiquibase.java:111)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1575)
2025-02-14 14:54:12.493 INFO 30592 --- [ task-8] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
问题原因
你的 Liquibase 无法获取数据库的锁,日志中明确指出:
-
当前锁持有者:。。。
-
锁定时间:2024-11-05, 11:21 a.m.(锁未释放,导致 Liquibase 不能执行新的更新)
-
涉及组件:
StandardLockService.waitForLock
MultiTenantDataSourceSpringLiquibase.initDb -
可能的原因:
- Liquibase 在上次执行时崩溃(进程异常退出,锁未释放)。
- 数据库连接断开(事务未提交,导致锁残留)。
- 多实例并发运行 Liquibase(多个进程尝试修改 DATABASECHANGELOGLOCK)。
- Liquibase 在多租户环境下执行失败(你的项目使用 MultiTenantDataSourceSpringLiquibase,可能多个租户同时竞争锁)。
解决方案
手动释放 Liquibase 锁
- 先选择数据库
你需要先指定要操作的数据库。例如,如果你的数据库名是 mydb,请先执行:
USE mydb;
- 然后再执行:
SELECT * FROM DATABASECHANGELOGLOCK;
- 手动释放 Liquibase 锁
UPDATE DATABASECHANGELOGLOCK
SET LOCKED = FALSE, LOCKGRANTED = NULL, LOCKEDBY = NULL
WHERE ID = 1;