首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Liquibase锁-原因?

Liquibase锁-原因?
EN

Stack Overflow用户
提问于 2013-03-21 00:06:16
回答 11查看 233.4K关注 0票数 326

当我在Oracle服务器上运行大量的liquibase脚本时,我得到了这个问题。SomeComputer就是我。

代码语言:javascript
复制
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)

会不会是同时进行的会话/事务的数量已经达到?有谁有什么想法吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-09-30 02:20:43

有时,如果更新应用程序突然停止,则锁仍然卡住。

然后运行

代码语言:javascript
复制
UPDATE DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

对数据库有帮助。

您可能还需要用LOCKED=FALSE替换LOCKED=0

或者您可以简单地删除DATABASECHANGELOGLOCK表,它将被重新创建。

票数 715
EN

Stack Overflow用户

发布于 2015-05-22 17:34:18

编辑2020年6月

不要听从这个建议。多年来,它给许多人带来了麻烦。很久以前,它对我很有效,我诚心诚意地把它贴了出来,但显然不是这样做的。DATABASECHANGELOCK表中需要包含内容,因此只删除其中的所有内容而不删除该表是一个坏主意。

例如,Leos Literak遵循了这些说明,服务器无法启动。

原始答案

这可能是由于被杀的liquibase进程没有释放其在DATABASECHANGELOGLOCK表上的锁。然后,

代码语言:javascript
复制
DELETE FROM DATABASECHANGELOGLOCK;

可能会对你有帮助。

编辑:@禤浩焯贝尔的回答提供了比这更好的解决方案。只有当你在使用他的解决方案时有任何问题时才这么做。

票数 67
EN

Stack Overflow用户

发布于 2013-03-22 17:42:24

问题在于Liquibase中SequenceExists的错误实现。因为使用这些语句的变更集花费了很长时间,并且被意外中止。然后,下一次尝试执行liquibase scripts时,锁就被持有了。

代码语言:javascript
复制
  <changeSet author="user" id="123">
    <preConditions onFail="CONTINUE">
      <not><sequenceExists sequenceName="SEQUENCE_NAME_SEQ" /></not>
    </preConditions>
    <createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
  </changeSet>

一种解决方法是使用普通SQL来检查:

代码语言:javascript
复制
  <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,或者删除该表并重新创建。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15528795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档