Wie kann ich in Postgres jede Stunde inkrementell sichern?

18

Es wurde versucht, eine stündliche Teilsicherung eines einzelnen Postgres-Servers (Win7 64) durchzuführen.

Ich habe das folgende Setup in postgresql.conf:

max_wal_senders = 2
wal_level       = archive
archive_mode    = on
archive_command = 'copy "%p" "c:\\postgres\\foo\\%f"'

(Neustart)

Ich habe ein Grundbackup mit gemacht pg_basebackup -U postgres -D ..\foo -F t -x

Was eine große base.tarDatei im fooOrdner erstellt und 16.384 KB-Dateien hinzugefügt hat, von denen ich annehme, dass es sich um WALs handelt.

Was ich nicht verstehe, ist, warum sich die WALs foonicht ändern . Die WALs im data/pg_xlogWandel. Soll pg sie nicht kopieren? Wie entscheidet es sich dafür?

Vielleicht muss ich einstellen archive_timeout=3600?

Ich habe mehrere Sites gesehen (pgs Mailinglisten, Baculas Postgres-Seite), die besagen, dass Sie pg_start_backup () und pg_stop_backup () aufrufen müssen, aber ich glaube, dass diese nicht erforderlich sind. Ist das wahr?

Sekundäre Fragen:

  1. Wie oft werden die WALs data/pg_xloggeschrieben? Was löst ein Schreiben aus?

    Es scheint eine WAL zu aktualisieren, wenn ich etwas DML dann \qin psql mache . Oder bearbeiten Sie eine Tabelle in pgAdmin und schließen Sie das Fenster. Ich dachte, es würde auf Commit schreiben.

  2. Best Practices? pg_basebackup einmal pro woche? WALs auf demselben Computer wie PG oder einem Remote-Computer archivieren?

Neil McGuigan
quelle

Antworten:

5

Sie möchten eine Teilsicherung des Archivordners auf einem Remotespeicher durchführen.

Wenn Sie von der Sicherung wiederherstellen müssen, ist das Basisszenario, dass Sie Ihre Basissicherung als Ausgangspunkt und den gesamten Inhalt des Archivordners benötigen, um die Transaktionsaktivität zwischen dem Startpunkt und dem Absturz wiederzugeben.

Um zu vermeiden, dass sich die Dateien im Archivordner für immer häufen, möchten Sie von Zeit zu Zeit eine neue Basissicherung durchführen und die Dateien löschen, die vor der neuen Basissicherung archiviert wurden.

Daniel Vérité
quelle
Vielen Dank. Einige Fragen: 1. Mache ich pg_start_backup (), kopiere die Daten und führe dann pg_stop_backup () oder pg_start_backup () aus; pg_stop_backup (), dann kopieren?
Neil McGuigan
@Neil: 1. und 2. gelten nicht, wenn Sie verwenden pg_basebackup, es kümmert sich bereits darum. 3. postgres löscht die WAL-Dateien automatisch, pg_logwenn sie nicht mehr benötigt werden. Sie sollten nichts manuell in tun pg_log. Ansonsten siehe wal_keep_segmentsParameter
Daniel Vérité
mit "archive" ordner meinst du pg_xlog, ja?
Neil McGuigan
@ NeilMcGuigan: überhaupt nicht. Der Archivordner ist der Zielordner Ihres Archivierungsbefehls, zum Beispiel hier "c: \ postgres \ foo". pg_xlogwird vollständig automatisch von postgres verwaltet, wohingegen der Archivordner vollständig vom DBA verwaltet wird.
Daniel Vérité
Ich schätze, ich bin verwirrt, weil sich die WALs in foo nach dem ersten pg_basebackup
Neil McGuigan,
8

Es gibt ein Tool, das Ihnen sehr helfen wird, WAL-E . Es bietet ein archive_commandund restore_commandfür PITR zu S3.

Es gibt keine Befehle für inkrementelle oder differenzielle logische Sicherungen. pg_dumpkann kein inkrementelles oder differentielles nehmen. Dies kann nur über die Protokollarchivierung erfolgen.

Theoretisch könnten Sie eine neue vollständige Sicherung erstellen, einen binären Vergleich zwischen dieser und der letzten Sicherung durchführen und den Vergleich hochladen. Dies scheint mir jedoch eine fragile und ineffiziente Möglichkeit zu sein, Dinge zu tun, und ich würde es wirklich nicht empfehlen.

Darüber hinaus unterstützt PgBarman die Integration mit S3 über Hook-Skripte und automatisiert einen Großteil der Sicherungsrotation und -verwaltung für Sie. Auch dies ist unter Windows möglicherweise keine Option.

Craig Ringer
quelle