Ich bekomme das, wenn ich viele Liquibase-Skripte auf einem Oracle-Server ausführe. SomeComputer bin ich.
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)
Könnte es sein, dass die Anzahl der gleichzeitigen Sitzungen / Transaktionen erreicht wird? Hat jemand irgendwelche Ideen?
Antworten:
Manchmal, wenn die Update-Anwendung abrupt gestoppt wird, bleibt die Sperre bestehen.
Dann rennen
gegen die Datenbank hilft.
Oder Sie können die
DATABASECHANGELOGLOCK
Tabelle einfach fallen lassen , sie wird neu erstellt.quelle
0
fürFALSE
, aber anders als das, es hat gut funktioniert. DankeFALSE
forb'0'
Edit Juni 2020
Befolgen Sie diesen Rat nicht. Es hat vielen Menschen im Laufe der Jahre Probleme bereitet. Es hat vor langer Zeit bei mir funktioniert und ich habe es in gutem Glauben veröffentlicht, aber es ist eindeutig nicht der richtige Weg, dies zu tun. Die DATABASECHANGELOCK-Tabelle muss Inhalte enthalten, daher ist es eine schlechte Idee, einfach alles daraus zu löschen.
Leos Literak beispielsweise befolgte diese Anweisungen und der Server konnte nicht gestartet werden.
Ursprüngliche Antwort
Möglicherweise liegt es daran, dass ein abgebrochener Liquibase-Prozess seine Sperre für die DATABASECHANGELOGLOCK-Tabelle nicht aufhebt. Dann,
könnte dir helfen.
Bearbeiten: Die Antwort von @Adrian Ber bietet eine bessere Lösung als diese. Tun Sie dies nur, wenn Sie Probleme bei der Lösung haben.
quelle
INSERT INTO yourdb.DATABASECHANGELOGLOCK VALUES (1, 0, null, null);
Das Problem war die fehlerhafte Implementierung von SequenceExists in Liquibase. Da die Änderungssätze mit diesen Aussagen sehr lange gedauert haben und versehentlich abgebrochen wurden. Beim nächsten Versuch, die Liquibase-Skripte auszuführen, wurde die Sperre gehalten.
Eine Problemumgehung verwendet stattdessen einfaches SQL, um dies zu überprüfen:
Sperrdaten werden in der Tabelle DATABASECHANGELOCK gespeichert. Um die Sperre aufzuheben, ändern Sie einfach 1 in 0 oder löschen diese Tabelle und erstellen sie neu.
quelle
Es wird nicht erwähnt, welche Umgebung zum Ausführen von Liquibase verwendet wird. Wenn es sich um Spring Boot 2 handelt, kann es erweitert werden,
liquibase.lockservice.StandardLockService
ohne dass direkte SQL-Anweisungen ausgeführt werden müssen, was viel sauberer ist. Z.B:Der Code erzwingt die Freigabe der Sperre. Dies kann bei Test-Setups hilfreich sein, bei denen der Release-Aufruf bei Fehlern möglicherweise nicht aufgerufen wird oder wenn das Debuggen abgebrochen wird.
Die Klasse muss im
liquibase.ext
Paket enthalten sein und wird von der automatischen Konfiguration von Spring Boot 2 übernommen.quelle
liquibase.ext
? Muss ich dieses Paket in meinem Projekt definieren?@PostConstruct
Methode mit einer Protokollnachricht definiert, sehe sie jedoch nicht gedruckt.@PostConstruct
Methode definiert ? Im ForceReleaseLockService? Dies ist kein Spring-Service, daher wird dieser nicht aufgerufen.Manchmal funktioniert das Abschneiden oder Löschen der Tabelle DATABASECHANGELOGLOCK nicht. Ich benutze die PostgreSQL-Datenbank und bin oft auf dieses Problem gestoßen. Zum Lösen rolle ich die vorbereiteten Anweisungen zurück, die im Hintergrund für diese Datenbank ausgeführt werden. Versuchen Sie, alle vorbereiteten Anweisungen zurückzusetzen und die Änderungen an der Liquibase erneut durchzuführen.
SQL:
Wenn die obige Anweisung einen Datensatz zurückgibt, setzen Sie diese vorbereitete Anweisung mit der folgenden SQL-Anweisung zurück.
quelle
Sie können die Tabelle sicher manuell oder mithilfe einer Abfrage löschen. Es wird automatisch neu erstellt.
quelle
Ich schätze, dass dies nicht das Problem des OP war, aber ich bin kürzlich auf dieses Problem mit einer anderen Ursache gestoßen. Als Referenz habe ich das Liquibase Maven-Plugin (Liquibase-Maven-Plugin: 3.1.1) mit SQL Server verwendet.
Wie auch immer, ich hatte fälschlicherweise eine SQL Server-Anweisung "use" kopiert und in eines meiner Skripte eingefügt, mit dem Datenbanken gewechselt werden. Daher wurde liquibase ausgeführt und aktualisiert
DATABASECHANGELOGLOCK
, wobei die Sperre in der richtigen Datenbank erworben und dann die Datenbanken gewechselt wurden , um die Änderungen zu übernehmen. Ich konnte nicht nur meine Änderungen oder das Liquibase-Audit NICHT in der richtigen Datenbank sehen, sondern beim erneuten Ausführen von Liquibase konnte die Sperre natürlich nicht erworben werden, da die Sperre in der "falschen" Datenbank freigegeben wurde und dies auch war immer noch in der "richtigen" Datenbank gesperrt. Ich hätte erwartet, dass Liquibase überprüft, ob das Schloss noch angewendet wurde, bevor es freigegeben wurde, und vielleicht ist das ein Fehler in Liquibase (ich habe es noch nicht überprüft), aber es wird möglicherweise in späteren Versionen behoben! Das heißt, ich nehme an, es könnte als Feature betrachtet werden!Ich weiß, ein ziemlicher Schuljungenfehler, aber ich spreche ihn hier an, falls jemand auf das gleiche Problem stößt!
quelle