Ist es sicher, eine PostgreSQL ALTER TABLE-Abfrage abzubrechen, die auf eine Sperre wartet?


10

Wir haben vor ALTER TABLEStunden eine Abfrage gestartet und erst kürzlich (via pg_stat_activity) festgestellt, dass sie auf ein Schloss wartet. Wir haben die andere Abfrage entdeckt, die eine Sperre für die Tabelle enthält, die wir ändern möchten, und sie nicht loslässt.

Unsere Abfrage ist eine "einfache" Abfrage (Ändern eines Spaltendatentyps), wird jedoch in einer massiven Tabelle ausgeführt.

Anstatt den Prozess zu beenden, der das Schloss festhält, haben wir beschlossen, den Prozess lieber zu beenden ALTER TABLE.

Wir haben nicht wickeln die ALTER TABLEin einer Transaktion.

Soweit ich weiß, bedeutet die Tatsache, dass unsere Abfrage auf eine Sperre wartet, dass sie immer auf eine Sperre gewartet hat und nie etwas geändert hat.

Ist das wahr? Ist es für uns sicher, unsere ALTER TABLEAnfrage sofort abzubrechen ? Oder ist es möglich, dass die Abfrage bereits etwas geändert hat und ein Abbrechen unsere Datenbank in einem halben Zustand belassen würde?

PS: Es ist geplant, es mit abzubrechen SELECT pg_cancel_backend(pid);. Wenn dies eine schlechte Idee ist, lassen Sie es mich bitte wissen.


1
Sollte in Ordnung sein, um die ALTER TABLE abzubrechen. PostgreSQL verfügt über Transaktions-DDL, und Sie sollten sich in demselben Zustand befinden, als hätten Sie die ALTER TABLE überhaupt nicht ausgeführt.
Josh Kupershmidt

Wenn Sie also sagen, dass PostgreSQL über eine Transaktions-DDL verfügt, bedeutet dies, dass jede schemawechselnde Abfrage im Wesentlichen innerhalb einer Transaktion ausgeführt wird?
JMTyler

1
In Ihrem Fall wird die ALTER TABLE "im Wesentlichen innerhalb einer Transaktion ausgeführt", da Sie sagten "Wir haben die ALTER TABLE nicht in eine Transaktion eingeschlossen". Wenn Sie möchten, können Sie BEGIN schreiben. ALTER TABLE foo ...; ALTER TABLE bar ...; usw. ; VERPFLICHTEN; - Das ist das wahre Killer-Feature von PostgreSQL mit Transaktions-DDL. Aber für Ihre unmittelbare Situation, ja, die ALTER TABLE alleine kann sicher abgebrochen werden und wird zurückgesetzt, als ob es nie passiert wäre.
Josh Kupershmidt

Vielen Dank für Ihre schnellen Antworten! Das sind sehr gute Informationen. Könnten Sie es als Antwort posten, damit ich es als akzeptiert markieren kann?
JMTyler

Antworten:


13

Soweit ich weiß, bedeutet die Tatsache, dass unsere Abfrage auf eine Sperre wartet, dass sie immer auf eine Sperre gewartet hat und nie etwas geändert hat.

Richtig - wenn Sie sehen, dass pg_stat_activity.waiting für eine ALTER TABLE "true" ist, bedeutet dies mit ziemlicher Sicherheit, dass sie geduldig auf die ACCESS EXCLUSIVE-Sperre für ihre Zieltabelle und ihre eigentliche Arbeit wartet (ggf. Umschreiben der Tabelle, Ändern von Katalogen) , Neuerstellung von Indizes usw.) hat noch nicht begonnen.

Ist es für uns sicher, unsere ALTER TABLE-Abfrage sofort abzubrechen? Oder ist es möglich, dass die Abfrage bereits etwas geändert hat und ein Abbrechen unsere Datenbank in einem halben Zustand belassen würde?

Das Abbrechen von Abfragen (oder gleichwertig das Zurücksetzen einer Transaktion) in PostgreSQL birgt keine Gefahr für die Beschädigung von Datenbanken, durch die Sie in bestimmten anderen Datenbanken möglicherweise erschreckt wurden (z. B. die schreckliche Warnung am Ende dieser Seite). Deshalb Nicht-Superuser sind, in den letzten Versionen, frei zu verwenden pg_cancel_backend()und pg_terminate_backend()eigene Abfragen zu töten in anderen Backends laufen - sie sind sicher ohne Sorgen um eine Beschädigung der Datenbank zu verwenden. Schließlich muss PostgreSQL auf jeden Prozess vorbereitet sein, der abgebrochen wird, z. B. SIGKILL vom OOM-Killer, Herunterfahren des Servers usw. Dafür ist das WAL-Protokoll gedacht .

Möglicherweise haben Sie auch gesehen, dass in PostgreSQL die meisten DDL-Befehle ausgeführt werden können, die in einer Transaktion (mit mehreren Anweisungen) verschachtelt sind, z

BEGIN;
ALTER TABLE foo ...;
ALTER TABLE bar ...;
-- more stuff
COMMIT; -- or ROLLBACK; if you've changed your mind

(Hervorragend geeignet, um sicherzustellen, dass Schema-Migrationen entweder alle zusammen oder gar nicht durchgeführt werden.) Sie sagten jedoch:

Wir haben nicht wickeln die ALTER TABLEin einer Transaktion.

Das ist in Ordnung für einen einzelnen Befehl - aus den Dokumenten ,

PostgreSQL behandelt tatsächlich jede SQL-Anweisung als innerhalb einer Transaktion ausgeführt. Wenn Sie keinen BEGIN-Befehl ausgeben, wird jede einzelne Anweisung mit einem impliziten BEGIN und (falls erfolgreich) COMMIT umwickelt. Eine Gruppe von Anweisungen, die von BEGIN und COMMIT umgeben sind, wird manchmal als Transaktionsblock bezeichnet.

Wenn Sie dies ALTER TABLEentweder über pg_cancel_backend()oder über eine Strg-C-Taste, die über die steuernde psql-Eingabeaufforderung ausgegeben wird, abbrechen, hat dies einen ähnlichen Effekt wie bei Ihnen

BEGIN;
ALTER TABLE ... ;
ROLLBACK;

(Wie Sie hoffentlich sehen werden, kann das Abbrechen dieser Kosten ALTER TABLEdie Datenbank vor unnötigem Schleifen bewahren, wenn Sie es ROLLBACKtrotzdem tun .)


5

Um auf Joshs richtige und ausgezeichnete Antwort einzugehen:

Ist es für uns sicher, unsere ALTER TABLE-Abfrage sofort abzubrechen?

Ja.

Es wäre sicher, selbst wenn es mitten im Umschreiben der Tabelle wäre .

Wenn Sie möchten, können Sie einfach den gesamten PostgreSQL-Server oder den Computer, auf dem er ausgeführt wird, herunterfahren, neu starten und alles wäre in Ordnung. DDL in PostgreSQL ist transaktions- und absturzsicher.

DDL-Vorgänge werden über WAL protokolliert und es wird garantiert, dass sie nach einem Absturz oder Abbruch entweder zurückgesetzt oder bei der Wiederherstellung abgeschlossen werden können.


3
Nur ein Hinweis zu "Sie könnten einfach den gesamten PostgreSQL-Server oder sogar den Computer, auf dem er ausgeführt wird, herunterfahren, neu starten und alles wäre in Ordnung" - ganz richtig, solange Sie zuverlässige Hardware haben, die nicht über fsync lügt , wiki.postgresql.org/wiki/Reliable_Writes
Josh Kupershmidt

2
@ JoshKupershmidt Sicher, aber das ist nicht spezifisch für DDL. Wenn Sie Synchronisierungsprobleme haben, sind Sie für alles absturzsicher .
Craig Ringer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.