Wir haben vor ALTER TABLE
Stunden 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 TABLE
in 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 TABLE
Anfrage 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.
quelle
Antworten:
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.
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()
undpg_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
(Hervorragend geeignet, um sicherzustellen, dass Schema-Migrationen entweder alle zusammen oder gar nicht durchgeführt werden.) Sie sagten jedoch:
Das ist in Ordnung für einen einzelnen Befehl - aus den Dokumenten ,
Wenn Sie dies
ALTER TABLE
entweder überpg_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(Wie Sie hoffentlich sehen werden, kann das Abbrechen dieser Kosten
ALTER TABLE
die Datenbank vor unnötigem Schleifen bewahren, wenn Sie esROLLBACK
trotzdem tun .)quelle
Um auf Joshs richtige und ausgezeichnete Antwort einzugehen:
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.
quelle