335

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)

同時セッション/トランザクションの数に達している可能性はありますか? 誰にもアイデアはありますか?

4

11 に答える 11

736

Sometimes if the update application is abruptly stopped, then the lock remains stuck.

Then running

UPDATE DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

against the database helps.

You may also need to replace LOCKED=0 with LOCKED=FALSE.

Or you can simply drop the DATABASECHANGELOGLOCK table, it will be recreated.

于 2013-09-29T18:20:42.503 に答える
28

問題は、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>

ロックデータは、テーブル DATABASECHANGELOCK に格納されます。ロックを解除するには、1 を 0 に変更するか、そのテーブルを削除して再作成します。

于 2013-03-22T09:42:24.167 に答える
3

テーブル DATABASECHANGELOGLOCK の切り捨てまたは削除が機能しないことがあります。私は PostgreSQL データベースを使用しており、この問題に何度も遭遇しました。解決するために私がすることは、そのデータベースのバックグラウンドで実行されている準備済みステートメントをロールバックすることです。すべての準備済みステートメントをロールバックして、liquibase の変更を再試行してください。

SQL:

SELECT gid FROM pg_prepared_xacts WHERE database='database_name';

上記のステートメントが何らかのレコードを返す場合、次の SQL ステートメントを使用してその準備済みステートメントをロールバックします。

ROLLBACK PREPARED 'gid_obtained_from_above_SQL';
于 2016-04-01T01:34:13.300 に答える