Wie behandelt PostgreSQL Checkpoints während einer WAL-fähigen Sicherung?

17

Auf einem PostgreSQL v9.0 habe ich ein WAL-Archivierungssystem. WAL-Dateien werden also regelmäßig archiviert (wenn 3 WAL erstellt werden oder wenn eine WAL älter als 15 Minuten ist).

Jetzt füge ich ein Binärpaket des PG_DATA-Verzeichnisses hinzu (mit Ausnahme des Unterverzeichnisses pg_xlog). Dazu führe ich eine pg_start_backup(),binäre Kopie durch und a pg_stop_backup().

Ich denke, ich verstehe ziemlich gut, was die pg_start_backup und pg_stop_backup tun, die erste einen Checkpoint machen und die letzte sicherstellen, dass die letzte WAL-Datei archiviert wird.

Aus der offiziellen Dokumentation können wir ersehen, dass wir für die binäre Datenkopie:

Führen Sie die Sicherung mit einem geeigneten Dateisystem-Sicherungsprogramm wie tar oder cpio durch (nicht pg_dump oder pg_dumpall). Es ist weder notwendig noch wünschenswert, den normalen Betrieb der Datenbank zu beenden, während Sie dies tun.

Also bin ich ziemlich ratlos. Dies bedeutet, dass ein Checkpoint durchgeführt werden kann, während die Kopie erstellt wird. Ich habe eine Menge Dokumentation gesehen, die besagt, dass der Kopierbefehl Datenänderungen während der Ausführung des Kopiervorgangs zulassen soll. Ich bin damit einverstanden, einfach eine Frage der Suche nach dem richtigen Werkzeug. Aber meine Frage ist, wie postgreSQL die Wiederherstellung mit einem pg_data-Inhalt handhabt, der einige Dateien enthält, die inkonsistent sind (einige vor dem Checkpoint, einige von danach)?

Durch die Wiedergabe der Transaktionsprotokolle kann Postgresql alle diese Dateien in den richtigen Zustand versetzen? Ich habe gesehen, dass das Erstellen von Tabellen und das Löschen von Vorgängen während der Sicherung gefährlich sind. Gibt es nicht gefährliche Vorgänge wie Vakuumbefehle ? Unterbricht der pg_backup die Vakuumoperationen? Soll ich am Ende des Starts des Binärkopiervorgangs eine Kopie der Datei global / pg_control erstellen? Sollte ich ein Snapshot-fähiges Dateisystem verwenden (wie bei einem xfs-freeze), um einen schnelleren Wiederherstellungsprozess zu erhalten?

Ich habe festgestellt, dass ein Absturz des Backup-Skripts ein pg_stop_backup nicht automatisch startet. Daher besteht die Möglichkeit, dass mein Backup-Status lange anhält (bis mein Nagios irgendwo anruft, um das pg_stop_backup () zu reparieren). Wenn sich also in PostgreSQL etwas zwischen diesen beiden Befehlen unterscheidet, würde ich es gerne wissen, um zu verstehen, welche Auswirkungen es haben könnte.

Erleuchte mich bitte.

regilero
quelle

Antworten:

7

Du hast gefragt:

wie postgreSQL die Wiederherstellung mit einem pg_data-Inhalt handhabt, der einige Dateien enthält, die inkonsistent sind.

pg_start_backup()Stellen Sie sicher, dass die Datendatei mindestens so neu ist wie der Prüfpunkt. Bei der Wiederherstellung werden die Protokolle angewendet.

Wenn die Daten alt sind, wird das Protokoll aktualisiert.

Wenn die Daten neu sind, hat das Protokoll den gleichen Inhalt. Es tut nicht weh, es noch einmal zu schreiben.

Die Daten sind nie neuer als das Protokoll, da die Protokolle vorausgeschrieben werden (WAL).


Du hast gefragt:

... xfs-freeze...

xfs-freezeist gleichbedeutend mit pg_start_backup(), es wird kein Schnappschuss gemacht. Dazu benötigen Sie einen Volume Manager.


Du hast gefragt:

... warum werden create tablespace & create database statements nicht unterstützt, wenn die WAL alles wiedergeben kann?

Es wird unterstützt, nur ein bisschen Gotcha. Siehe http://www.postgresql.org/docs/8.1/static/backup-online.html :

23.3.5. Vorbehalte

CREATE TABLESPACE-Befehle werden mit dem absoluten Literalpfad WAL-protokolliert und werden daher als Tablespace-Erstellungen mit demselben absoluten Pfad wiedergegeben. Dies ist möglicherweise unerwünscht, wenn das Protokoll auf einem anderen Computer wiedergegeben wird. Es kann gefährlich sein, auch wenn das Protokoll auf demselben Computer, jedoch in einem neuen Datenverzeichnis, wiedergegeben wird: Die Wiedergabe überschreibt weiterhin den Inhalt des ursprünglichen Tabellenbereichs. Um potenzielle Probleme dieser Art zu vermeiden, empfiehlt es sich, nach dem Erstellen oder Löschen von Tablespaces eine neue Basissicherung zu erstellen.

J-16 SDiZ
quelle
über xfs-freeze Ich weiß, dass dies auch von einem Volume-Manager abhängt, es war nur ein Teil des Schnappschussverfahrens. Aber sind wir sicher, dass die WAL-Wiederherstellung die Wiedergabe von Protokollen einer Pre-Vacuum-Tabelle auf einer Post-Vacuum-Binärtabelle gut verarbeiten kann? und ist der inhalt von global / pg_control wichtig? Warum werden create tablespace & create database-Anweisungen nicht unterstützt, wenn die WAL alles wiedergeben kann?
Regilero
CREATE TABLESPACEfunktioniert. Siehe aktualisierte Antwort. Ich bin mir nicht sicher VACUUM, aber ich kann mir nicht vorstellen, warum es nicht so ist.
J-16 SDiZ