Liquibase lock-powody?

Dostaję to, gdy uruchamiam wiele skryptów liquibase na serwerze Oracle. Jakiś komputer To ja.

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)

Czy możliwe jest osiągnięcie liczby jednoczesnych sesji/transakcji? Ktoś ma jakieś pomysły?

Author: Radek Postołowicz, 2013-03-20

8 answers

Czasami, gdy aplikacja aktualizacji zostanie nagle zatrzymana, blokada pozostaje zablokowana.

Then running

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

Przeciwko bazie danych pomaga.

Może być również konieczne zastąpienie LOCKED=0 przez LOCKED=FALSE.

Lub po prostu upuść DATABASECHANGELOGLOCK tabelę, zostanie ona odtworzona.

 654
Author: Adrian Ber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-24 10:39:30

Edycja czerwiec 2020

Nie stosuj się do tej rady. Przez lata przysporzyło to wielu ludziom kłopotów. To działało dla mnie dawno temu i zamieściłem go w dobrej wierze, ale najwyraźniej nie jest to sposób, aby to zrobić. Tabela bazy danych musi mieć coś w sobie, więc to zły pomysł, aby po prostu usunąć wszystko z niej.

Na przykład Leos Literak postępował zgodnie z tymi instrukcjami i serwer nie mógł się uruchomić.

Oryginalna odpowiedź

Jest to prawdopodobnie spowodowane zabił proces liquibase nie zwalniając swojej blokady w tabeli bazy danych. Następnie

DELETE FROM DATABASECHANGELOGLOCK;
Może Ci pomóc.

Edit: @Adrian Ber ' s answer provides a better solution than this. Zrób to tylko, jeśli masz jakieś problemy z jego rozwiązaniem.

 63
Author: e18r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-18 14:30:51

Problemem była błędna implementacja Sequencexists w Liquibase. Ponieważ zmiany z tych oświadczeń trwało bardzo długo i został przypadkowo przerwany. Następnie przy kolejnej próbie wykonania skryptów liquibase blokada została wstrzymana.

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

Obejście polega na użyciu zwykłego SQL, aby sprawdzić to zamiast:

  <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 jest przechowywana w bazie danych tablechangelock. Aby pozbyć się blokady wystarczy zmienić 1 na 0 lub upuścić Ten stół i odtworzyć.

 27
Author: Peter Isberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 12:34:32

Nie wspomniano, które środowisko jest używane do uruchamiania Liquibase. W przypadku Spring Boot 2 możliwe jest rozszerzenie liquibase.lockservice.StandardLockService bez konieczności uruchamiania poleceń direct SQL, co jest dużo czystsze. Np.:

/**
 * 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();
    }
}

Kod wymusza zwolnienie zamka. Może to być przydatne w konfiguracjach testowych, w których wywołanie release może nie zostać wywołane w przypadku błędów lub gdy debugowanie zostanie przerwane.

Klasa musi być umieszczona w opakowaniu liquibase.ext i zostanie odebrana przez Spring Boot 2 automatyczna konfiguracja.

 9
Author: k_o_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-04 21:39:14

Czasami obcinanie lub upuszczanie tabeli bazy danych nie działa. Korzystam z bazy danych PostgreSQL i natknąłem się na ten problem wiele razy. To, co robię, aby rozwiązać, to wycofać przygotowane instrukcje działające w tle dla tej bazy danych. Spróbuj cofnąć wszystkie przygotowane oświadczenia i spróbuj ponownie zmienić liquibase.

SQL:

SELECT gid FROM pg_prepared_xacts WHERE database='database_name';

Jeśli powyższe polecenie zwraca jakikolwiek rekord, to wycofuje przygotowane polecenie następującym poleceniem SQL.

ROLLBACK PREPARED 'gid_obtained_from_above_SQL';
 3
Author: Koushik Ravulapelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 01:53:00

Doceniam, że to nie był problem OP, ale ostatnio natknąłem się na ten problem z inną przyczyną. Dla odniesienia, używałem liquibase Maven plugin (liquibase-maven-plugin:3.1.1) z SQL Server.

W każdym razie, błędnie skopiowałem i wkleiłem instrukcję SQL Server "use" do jednego z moich skryptów, który przełącza bazy danych, więc liquibase uruchamiał i aktualizował DATABASECHANGELOGLOCK, nabywając blokadę we właściwej bazie danych, ale potem przełączając bazy danych, aby zastosować zmiany. Nie tylko mógł Nie widzę moich zmian ani audytu liquibase w poprawnej bazie danych, ale oczywiście, gdy uruchomiłem liquibase ponownie, nie mógł uzyskać blokady, ponieważ blokada została zwolniona w "złej" bazie danych, a więc nadal była zablokowana w" poprawnej " bazie danych. Spodziewałem się, że liquibase sprawdzi, czy blokada została jeszcze zastosowana przed jej zwolnieniem, i może jest to błąd w liquibase (jeszcze nie sprawdziłem), ale może być rozwiązany w późniejszych wersjach! To powiedziawszy, przypuszczam, że można to uznać za feature!

Dość mały błąd ucznia, wiem, ale podnoszę go tutaj na wypadek, gdyby ktoś napotkał ten sam problem!

 2
Author: DarthPablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 14:48:51

Możesz bezpiecznie usunąć tabelę ręcznie lub za pomocą zapytania. Zostanie odtworzony automatycznie.

DROP TABLE DATABASECHANGELOGLOCK;
 2
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-14 17:14:20

W postgres 12 musiałem użyć tego polecenia:

UPDATE DATABASECHANGELOGLOCK SET LOCKED=false, LOCKGRANTED=null, LOCKEDBY=null where ID=1;
 0
Author: g.momo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-11 13:23:36