Liquibase lock - reasons? Liquibase lock - reasons? oracle oracle

Liquibase lock - reasons?


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.


Edit june 2020

Don't follow this advice. It's caused trouble to many people over the years. It worked for me a long time ago and I posted it in good faith, but it's clearly not the way to do it. The DATABASECHANGELOCK table needs to have stuff in it, so it's a bad idea to just delete everything from it without dropping the table.

Leos Literak, for instance, followed these instructions and the server failed to start.

Original answer

It's possibly due to a killed liquibase process not releasing its lock on the DATABASECHANGELOGLOCK table. Then,

DELETE FROM DATABASECHANGELOGLOCK;

might help you.

Edit: @Adrian Ber's answer provides a better solution than this. Only do this if you have any problems doing his solution.


The problem was the buggy implementation of SequenceExists in Liquibase. Since the changesets with these statements took a very long time and was accidently aborted. Then the next try executing the liquibase-scripts the lock was held.

  <changeSet author="user" id="123">    <preConditions onFail="CONTINUE">      <not><sequenceExists sequenceName="SEQUENCE_NAME_SEQ" /></not>    </preConditions>    <createSequence sequenceName="SEQUENCE_NAME_SEQ"/>  </changeSet>

A work around is using plain SQL to check this instead:

  <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 is stored in the table DATABASECHANGELOCK. To get rid of the lock you just change 1 to 0 or drop that table and recreate.