当我在Oracle服务器上运行大量的liquibase脚本时,我得到了这个问题。SomeComputer就是我。
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Liquibase Update Failed: Could not acquire change log lock. Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
SEVERE 2013-03-20 16:59:liquibase: Could not acquire change log lock. Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
liquibase.exception.LockException: Could not acquire change log lock. Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
at liquibase.lockservice.LockService.waitForLock(LockService.java:81)
at liquibase.Liquibase.tag(Liquibase.java:507)
at liquibase.integration.commandline.Main.doMigration(Main.java:643)
at liquibase.integration.commandline.Main.main(Main.java:116)
会不会是同时进行的会话/事务的数量已经达到?有谁有什么想法吗?
发布于 2013-09-30 02:20:43
有时,如果更新应用程序突然停止,则锁仍然卡住。
然后运行
UPDATE DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;
对数据库有帮助。
您可能还需要用LOCKED=FALSE
替换LOCKED=0
。
或者您可以简单地删除DATABASECHANGELOGLOCK
表,它将被重新创建。
发布于 2013-03-22 17:42:24
问题在于Liquibase中SequenceExists的错误实现。因为使用这些语句的变更集花费了很长时间,并且被意外中止。然后,下一次尝试执行liquibase scripts时,锁就被持有了。
<changeSet author="user" id="123">
<preConditions onFail="CONTINUE">
<not><sequenceExists sequenceName="SEQUENCE_NAME_SEQ" /></not>
</preConditions>
<createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
</changeSet>
一种解决方法是使用普通SQL来检查:
<changeSet author="user" id="123">
<preConditions onFail="CONTINUE">
<sqlCheck expectedResult="0">
select count(*) from user_sequences where sequence_name = 'SEQUENCE_NAME_SEQ';
</sqlCheck>
</preConditions>
<createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
</changeSet>
Lockdata存储在表DATABASECHANGELOCK中。要解除锁定,只需将1更改为0,或者删除该表并重新创建。
发布于 2019-04-05 05:39:15
没有提到使用哪个环境来执行Liquibase。如果是Spring Boot2,则可以扩展liquibase.lockservice.StandardLockService
而不需要运行直接的SQL语句,这要干净得多。例如:
/**
* This class is enforcing to release the lock from the database.
*
*/
public class ForceReleaseLockService extends StandardLockService {
@Override
public int getPriority() {
return super.getPriority()+1;
}
@Override
public void waitForLock() throws LockException {
try {
super.forceReleaseLock();
} catch (DatabaseException e) {
throw new LockException("Could not enforce getting the lock.", e);
}
super.waitForLock();
}
}
代码强制释放锁。这在测试设置中很有用,在这种设置中,在出现错误或调试中止时可能不会调用release调用。
该类必须放在liquibase.ext
包中,并将由Spring Boot2自动配置获取。
https://stackoverflow.com/questions/15528795
复制相似问题