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).
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äuftpg_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, umpg_start_backup()
zu vermeiden, dass Transaktionen wiederhergestellt werden, die zwischen dempg_start_backup()
Snapshot und dem Dateisystem-Snapshot auftreten.Antworten:
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
CHECKPOINT
erste 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ührenpg_stop_backup
und 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_backup
undpg_stop_backup
besteht darinpg_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=stream
wurde nur in ziemlich neuen Versionen hinzugefügt, undpg_basebackup
sein 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 einenSERIALIZABLE
Snapshot 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
VACUUM
Arbeit 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.
quelle
pg_dump
was 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.