Rozumiem to, gdy uruchamiam wiele skryptów Liquibase przeciwko serwerowi Oracle. SomeComputer 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 to możliwe, że osiągnięto liczbę jednoczesnych sesji / transakcji? Czy ktoś ma jakieś pomysły?
Odpowiedzi:
Czasami, jeśli aplikacja aktualizacji zostanie nagle zatrzymana, blokada pozostaje zablokowana.
Potem biegnij
przeciwko bazie danych pomaga.
Lub możesz po prostu upuścić
DATABASECHANGELOGLOCK
tabelę, zostanie ona odtworzona.źródło
0
naFALSE
, ale poza tym działało dobrze. DziękiFALSE
forb'0'
Edytuj czerwca 2020 r
Nie stosuj się do tej porady. Przez lata sprawiało wielu ludziom kłopoty. Dawno temu działało to dla mnie i opublikowałem je w dobrej wierze, ale najwyraźniej nie jest to odpowiedni sposób. Tabela DATABASECHANGELOCK musi mieć w sobie różne elementy, więc usunięcie tego wszystkiego jest złym pomysłem.
Na przykład Leos Literak zastosował się do tych instrukcji i serwer nie uruchomił się.
Oryginalna odpowiedź
Jest to prawdopodobnie spowodowane tym, że proces zabitego likibazy nie zwalnia blokady na stole DATABASECHANGELOGLOCK. Następnie,
może ci pomóc.
Edycja: odpowiedź @Adriana Bera stanowi lepsze rozwiązanie niż to. Zrób to tylko, jeśli masz problemy z jego rozwiązaniem.
źródło
INSERT INTO yourdb.DATABASECHANGELOGLOCK VALUES (1, 0, null, null);
Problemem była błędna implementacja SequenceExists w Liquibase. Ponieważ zestawy zmian z tymi instrukcjami zajęły bardzo dużo czasu i zostały przypadkowo przerwane. Następnie następna próba wykonania skryptów likibase blokada została wstrzymana.
W celu obejścia tego problemu należy użyć zwykłego kodu SQL:
Dane blokady są przechowywane w tabeli DATABASECHANGELOCK. Aby pozbyć się blokady, wystarczy zmienić 1 na 0 lub upuścić tę tabelę i odtworzyć.
źródło
Nie wspomniano, które środowisko jest używane do uruchamiania Liquibase. W przypadku Spring Boot 2 istnieje możliwość rozszerzenia
liquibase.lockservice.StandardLockService
bez potrzeby uruchamiania bezpośrednich instrukcji SQL, co jest znacznie bardziej przejrzyste. Na przykład:Kod wymusza zwolnienie blokady. Może to być przydatne w zestawach testowych, w których wywołanie wydania może nie zostać wywołane w przypadku błędów lub przerwania debugowania.
Klasa musi zostać umieszczona w
liquibase.ext
pakiecie i zostanie odebrana przez automatyczną konfigurację Spring Boot 2.źródło
liquibase.ext
, czy muszę zdefiniować ten pakiet w moim projekcie?@PostConstruct
metodę z komunikatem dziennika, ale nie widzę jej wydrukowanej.@PostConstruct
metodę? W ForceReleaseLockService? To nie jest usługa wiosenna, więc nie zostanie wywołana.Czasami obcinanie lub upuszczanie tabeli DATABASECHANGELOGLOCK nie działa. Korzystam z bazy danych PostgreSQL i wiele razy natknąłem się na ten problem. To, co robię w celu rozwiązania, to wycofanie przygotowanych instrukcji działających w tle dla tej bazy danych. Spróbuj wycofać wszystkie przygotowane wyciągi i spróbuj ponownie wprowadzić zmiany w likibazie.
SQL:
Jeśli powyższa instrukcja zwraca dowolny rekord, wówczas wycofaj tę przygotowaną instrukcję z następującą instrukcją SQL.
źródło
Możesz bezpiecznie usunąć tabelę ręcznie lub za pomocą zapytania. Zostanie odtworzony automatycznie.
źródło
Rozumiem, że to nie był problem PO, ale ostatnio natknąłem się na ten problem z innej przyczyny. Dla porównania użyłem wtyczki Liquibase Maven (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 ze moich skryptów, które zmieniają bazy danych, więc likibase działało i aktualizowało
DATABASECHANGELOGLOCK
, uzyskiwało blokadę w poprawnej bazie danych, ale następnie przełączało bazy danych, aby zastosować zmiany. Nie tylko NIE mogłem zobaczyć moich zmian lub audytu likibase w prawidłowej bazie danych, ale oczywiście, kiedy ponownie uruchomiłem likibase, nie mógł uzyskać blokady, ponieważ blokada została zwolniona w „niewłaściwej” bazie danych, i tak też było wciąż jest zamknięty w „poprawnej” bazie danych. Oczekiwałem, że Liquibase sprawdzi, czy zamek został jeszcze zastosowany przed jego zwolnieniem, i być może jest to błąd w Liquibase (jeszcze tego nie sprawdziłem), ale można go rozwiązać w późniejszych wersjach! To powiedziawszy, przypuszczam, że można to uznać za funkcję!Wiem, że to trochę błąd ucznia, ale podnoszę go tutaj, na wypadek, gdyby ktoś napotkał ten sam problem!
źródło