PostgreSQL-Befehlsäquivalente "Freeze" / "Unfreeze"

7

In Derby (einer in Java geschriebenen eingebetteten Datenbank, die hauptsächlich zum Testen oder Prototyping verwendet wird) gibt es die Befehle "Freeze" und "Unfreeze", die während einer Online-Sicherung verwendet werden können . "Freeze" bewirkt einfach, dass alle Datenbankzugriffe blockiert werden, bis "unfreeze" aufgerufen wird. Dies ist nützlich für die Sicherung mit einem externen Programm. Dies ist möglicherweise der Fall, wenn das externe Programm viel schneller ist als die Verwendung der internen Sicherungslösung von Derby. Für meinen Anwendungsfall kann ich mit einigen integrierten Dateisystem-Dienstprogrammen fast sofort einen Schnappschuss erstellen, sodass es sich um eine zeitkonstante Operation handelt (nicht O(length of DB files)).

Ich migriere eine Anwendung, die Derby entwachsen ist, zu PostgreSQL und habe mich gefragt, ob es dort etwas Vergleichbares gibt, mit dem ich alle Verbindungen stilllegen kann. Außerdem möchte ich lieber wissen, was mein Serialisierungspunkt in meiner Anwendung ist, damit ich nicht in einen unangenehmen Zustand gerate. Daher ist es für mich sehr schön, alle anderen Zugriffe anhalten / fortsetzen zu können.

Da PostgreSQL über ein Transaktionsprotokoll verfügt, könnte ich einfach einen Snapshot erstellen, ohne ihn einzufrieren. Der Snapshot muss jedoch über den Wiederherstellungsmechanismus von PostgreSQL ausgeführt werden, bevor ich ihn verwenden kann, da sonst das, was auf der Festplatte gespeichert ist, das gleiche ist, als würde ich es ziehen der Stecker auf einem normalen Dateisystem. Diese Lösung ist nicht ideal.

BEARBEITEN Ich habe erfahren, dass dies pg_start_backup()nahe beieinander liegt, aber eingehende Transaktionen werden erst nach einem übereinstimmenden Aufruf blockiert pg_stop_backup(), sodass ich gezwungen bin, zu einem bestimmten Zeitpunkt eine Wiederherstellung der Transaktions-ID durchzuführen, pg_start_backup()die von einem Dateisystem-Snapshot zurückgegeben wird. Es wäre schön, nicht zu haben , tatsächlich Shutdown PostgreSQL , um diese zu bekommen (vielleicht gibt es einen pseudo-Shutdown - Befehl, die Verbindungen offen? Hält).

Dan
quelle
Ich denke, Sie suchen nach pg_start_backup(): postgresql.org/docs/current/static/… Aber Sie sollten dies lesen: postgresql.org/docs/current/static/backup-file.html, um zu verstehen, warum Sie nicht einfach ein Dateisystem nehmen können Backup während der Server läuft
a_horse_with_no_name
Ich würde vorschlagen, diese Frage auf dba.SE zu migrieren.
Erwin Brandstetter
@a_horse_with_no_name pg_start_backup()ist nah. Gibt es eine Möglichkeit, andere Schreibvorgänge tatsächlich zu blockieren, damit der Snapshot garantiert konsistent ist (außer das Herunterfahren der Datenbank vor dem Snapshot)? Andernfalls muss ich anscheinend noch eine Wiederherstellung zu einem bestimmten Zeitpunkt für die Transaktion durchführen, um pg_start_backup()zu vermeiden, dass Transaktionen wiederhergestellt werden, die zwischen dem pg_start_backup()Snapshot und dem Dateisystem-Snapshot auftreten.
Dan
@ Dan: Hm, ich kann mich einfach mit demselben Konto bei anderen Stackexchange-Sites mit dem Stackexchange-Konto anmelden.
Erwin Brandstetter
@Dan: Kennzeichnen Sie es einfach und fragen Sie nach dem Umzug. Moderatoren werden es für Sie migrieren.
Erwin Brandstetter

Antworten:

9

Es gibt kein genaues Äquivalent zu dem, was Sie wollen. Zu den Optionen gehören:

Atomic Dateisystem-Snapshot

Wenn Sie einen Snapshot eines atomaren Dateisystems verwenden, müssen Sie die Datenbank nicht einfrieren. Es könnte die Wiederherstellung etwas beschleunigen, wenn Sie eine CHECKPOINTerste erzwingen , aber das war es auch schon. Wenn Sie einen Dateisystem-Snapshot erstellen und kopieren und dann die Kopie nach PostgreSQL starten, ist es, als ob er abgestürzt wäre und wieder gestartet wird. Das ist vollkommen in Ordnung, es ist absturzsicher und so konzipiert, dass es funktioniert.

Dieser Ansatz ist nur gültig, wenn der Snapshot atomar ist - er befindet sich alle im selben virtuellen Moment. Sie können keinen atomaren Snapshot über mehrere Dateisysteme hinweg erhalten (zumindest unter Linux). Wenn Ihre Datenbank also auf mehrere Tablespaces aufgeteilt ist oder sich WAL auf einer separaten Festplatte zum Heap befindet, können Sie diesen Ansatz nicht verwenden.

pg_start_backup /. pg_stop_backup

Wenn Sie keinen atomaren Snapshot erstellen können, können Sie die WAL-Archivierung aktivieren, ausführen pg_start_backup, die Datenbank kopieren, ausführen pg_stop_backupund die zuletzt generierten WAL-Archive erfassen.

Es ist etwas komplizierter, bietet Ihnen jedoch eine konsistente Sicherung, ohne die Schreibvorgänge anzuhalten und ohne atomare Snapshots auf Dateisystemebene zu benötigen.

pg_basebackup

Eine Alternative zur Verwendung von pg_start_backupund pg_stop_backupbesteht darin pg_basebackup, eine Streaming- Kopie der Datenbank über das PostgreSQL-Replikationsprotokoll mit zu erstellen --xlog-method=stream. Dies erfordert nur eine PostgreSQL-Replikationsverbindung, erfordert nicht, dass die Datenbank gestoppt wird, und ist ziemlich nahtlos.

--xlog-method=streamwurde nur in ziemlich neuen Versionen hinzugefügt, und pg_basebackupsein Selbst ist ziemlich neu.

pg_dump

Ich habe es anfangs nicht erwähnt, weil Sie nach externen Tools gesucht haben, aber es gibt immer Tools pg_dump, die einen SERIALIZABLESnapshot der Datenbank abrufen und diese sichern. Die Datenbank läuft wie gewohnt weiter (sie kann weiterhin Schreibvorgänge akzeptieren) und der Speicherauszug ist ab dem Zeitpunkt, an dem Sie den Speicherauszug gestartet haben, vollständig intern konsistent.

Schreiben Sie Ruhe

Durch das Stoppen aller eingehenden Transaktionen wird das Schreiben von PostgreSQL nicht gestoppt. Es wird immer noch VACUUMArbeit mit Autovakuum, Checkpoints zum Durchführen, Statistiken zum Schreiben usw. zu tun haben .

Es gibt keine Funktion in Pg, um alle Schreibvorgänge an dieser Stelle zu stoppen. Es mag schön sein, etwas hinzuzufügen, aber mir ist nicht bekannt, dass jemand daran arbeitet.

Einige Dateisysteme, wie XFS, unterstützen das Einfrieren von Schreibvorgängen auf Dateisystemebene. Dadurch werden alle Schreibvorgänge blockiert, bis das Einfrieren freigegeben wird. Es ist sicher, alle Dateisysteme einzufrieren und dann alle Dateisysteme zu kopieren.

Craig Ringer
quelle
Danke, das klärt einige Dinge auf. Ich habe noch eine Anforderung, die ich vergessen habe zu erwähnen: Ich versuche, die Schreibvorgänge zu stoppen, da ich diese Funktionalität verwende, um einen Snapshot zu erstellen, der mit dem einer anderen Datenquelle übereinstimmt. Wenn ich Schreibvorgänge nicht blockieren kann, sind die beiden Datenquellen im Snapshot möglicherweise inkonsistent.
Dan
@Dan: Mit pg_dump können Sie einen konsistenten Snapshot erstellen, ohne Schreibvorgänge blockieren zu müssen.
a_horse_with_no_name
@a_horse_with_no_name Ich nahm es als gegeben an, pg_dumpwas keine Option aus "Dies ist nützlich für das Sichern mit einem externen Programm, was Sie tun können, wenn das externe Programm viel schneller ist als die Verwendung von Derbys interner Sicherungslösung", wobei der Autor das wünscht Gleiches gilt für S. Sollte trotzdem erwähnen.
Craig Ringer
@a_horse_with_no_name CraigRinger hat mich in diesem Fall richtig verstanden.
Dan
1
Abschließend erklärte ein PostgreSQL-Experte in meinem Unternehmen, dass das Herunterfahren der Instanz der einzige Weg ist, genau das zu erreichen, was ich wollte.
Dan