DBAtlas · Atlas für Datenbankbetrieb

PostgreSQL: logische Sicherung und Wiederherstellung (pg_dump / pg_restore)

PostgreSQLStufe: MittelDauer: 20–90 Min. (je nach Datenmenge)

Logische Sicherung und Wiederherstellung mit pg_dump, pg_dumpall und pg_restore auf Ebene von Tabelle, Schema, Datenbank oder ganzem Cluster; nur Struktur (DDL) oder nur Daten, Umzug auf einen anderen Server bzw. eine andere Version, Wiederherstellung einer einzelnen Tabelle aus einem Dump sowie zeitgesteuerte, geprüfte Sicherungen mit Aufbewahrungsfrist über systemd/cron. Jeder Weg endet mit einer Prüfung, die Zeilenzahlen vergleicht. In Streaming-Replication- und Patroni-Clustern wird der Dump von einem Replica gezogen (HAProxy-Leseport oder Standby), die Wiederherstellung erfolgt nur auf dem Primary/Leader.

Eine logische Sicherung führt auf den Zeitpunkt des Dumps zurück und erlaubt keine Point-in-Time-Recovery (PITR); in der Produktion muss die eigentliche Sicherung physisch sein: pgBackRest (empfohlen) oder ohne Zusatzwerkzeuge pg_basebackup + WAL-Archiv. Um eine große Datenbank mit Sekunden Ausfallzeit auf eine neue Version zu bringen, nimm Logical Replication; für ein In-place-Upgrade auf demselben Server pg_upgrade.

Topologie: 1 Server, Streaming Replication (Primary + Standby) oder ein Patroni-Cluster; beim Umzug Quelle + Ziel, bei zeitgesteuerter Remote-Sicherung zusätzlich ein Backup-Server

Szenarien

  • Einzelne Tabelle(n) exportieren / importieren — Struktur und Daten der ausgewählten Tabellen (inklusive Indizes, Constraints, Trigger) werden gesichert und in eine andere Datenbank geladen.
  • Ein Schema exportieren / importieren — Alle Objekte des Schemas (Tabellen, Views, Funktionen, Sequenzen) werden gesichert.
  • Einzelne Datenbank sichern / wiederherstellen — Eine ganze Datenbank (Struktur + Daten) wird in einen einzigen Dump geschrieben und in dieselbe oder eine andere Datenbank zurückgeladen. Rollen (globals) sind nicht enthalten.
  • Ganzer Cluster (Rollen + Tablespaces + jede Datenbank) — Globals mit pg_dumpall -g, ein eigener pg_dump je Datenbank; die Wiederherstellung wird auf einem temporären Test-Cluster geprobt.
  • Nur Schemastruktur (DDL) — Definitionen von Tabellen, Indizes, Views und Funktionen ohne Daten; zur Prüfung, für die Versionsverwaltung oder zum Aufbau einer leeren Umgebung.
  • Nur Daten — Nur die Zeilen (COPY) werden übertragen, während die Struktur auf dem Ziel bereits vorhanden ist.
  • Auf anderen Server / andere Version umziehen — Auf dem Zielserver verbindet sich der pg_dump der neuen Version über das Netz mit der Quelle; die Übertragung läuft über eine Pipe oder eine Datei.
  • Einzelne Tabelle / einzelnes Objekt aus einem Dump wiederherstellen — Aus einem vorhandenen Custom- oder Directory-Dump wird mit einer Listendatei (-L) nur eine Tabelle samt ihren Indizes, Constraints und Daten wiederhergestellt.
  • Zeitgesteuerte Sicherung (systemd timer / cron) — Tägliche Sicherung von Globals + Datenbanken, Lesbarkeitsprüfung, Aufbewahrungsfrist, Log und Fehlermeldung.

Vor dem Start

  • …Der Patroni-Cluster läuft; auf diesem Server sind die Client-Werkzeuge von PostgreSQL … (…) installiert, und die Ports von HAProxy/VIP (…) zum Schreiben (…)… und Lesen (…)… sind erreichbar. Du hast das Passwort der Rolle postgres (bei Patroni PATRONI_SUPERUSER_PASSWORD in /etc/patroni/patroni.env).…Auf dem Primary läuft PostgreSQL …, und der Benutzer postgres kann sich lokal (peer) verbinden; der Standby … ist im Zustand streaming, und sein Port … ist vom Primary aus erreichbar. Da sich der Dump über das Netz mit dem Standby verbindet, braucht die Rolle postgres ein Passwort (falls nicht, auf dem Primary \password postgres; das Passwort gelangt per WAL auf den Standby).…PostgreSQL … läuft, und der Betriebssystembenutzer postgres kann sich lokal (peer) verbinden. Wurde mit dem DBAtlas-Guide PostgreSQL-Einzelserver-Installation installiert, sind die Pfade identisch.…
  • …Der Cluster ist gesund: ein Leader, mindestens ein Replica im Zustand streaming, geringe Verzögerung. Prüfe das auf einem der Patroni-Nodes.…Der Standby … ist mit dem Primary verbunden, und seine Verzögerung ist gering (der Dump erfasst den Stand des Standby zu diesem Zeitpunkt).…
  • Das Sicherungsverzeichnis … liegt auf einer von der Datenplatte getrennten Platte und hat genug freien Platz: Ein komprimierter Custom- oder Directory-Dump hat meist 10–30 % der Datenbankgröße (Indizes kommen nur als Definition in den Dump); Plain-Format und unkomprimierte Dumps sind größer.
  • pg_dump hat dieselbe oder eine neuere Hauptversion als der zu sichernde Server (ein neuerer pg_dump kann einen älteren Server lesen, umgekehrt nicht). pg_restore muss dieselbe oder eine neuere Version haben als der pg_dump, der den Dump erstellt hat.
  • pg_dump/pg_restore auf dem Ziel (…) haben dieselbe oder eine neuere Hauptversion als der Quellserver (…): Der Umzug läuft mit den neueren Werkzeugen des Ziels.
  • Die Software der auf der Quelle verwendeten Extensions (postgis, pgvector, pg_partman…) ist auch auf dem Zielserver installiert. Eine logische Sicherung überträgt nur die Zeile CREATE EXTENSION, nicht die Extension selbst.
  • Gibt es benutzerdefinierte Tablespaces (die folgende Abfrage liefert Zeilen), müssen auf dem Ziel dieselben Verzeichnisse vorbereitet werden, oder die Wiederherstellung erfolgt mit --no-tablespaces in den Standard-Tablespace.
  • Auf dem Zielserver … ist PostgreSQL … installiert, läuft und ist leer (nur postgres, template0, template1). Das Ziel erreicht den Port … der Quelle.
  • Der Backup-Server … erreicht …den Port … der HAProxy-/VIP-Adresse ……den Port … des Standby ……den Port … des Datenbankservers… und hat Zugriff auf das PGDG-Repository (oder einen internen Mirror).
  • Der Server kann E-Mails versenden: Der lokale MTA (postfix) leitet an das SMTP-Relay des Unternehmens weiter.
  • Für eine große Wiederherstellung oder einen Umzug ist ein Wartungsfenster eingeplant; wird das Ziel überschrieben, existiert eine Sicherung bzw. ein Snapshot des Ziels.

Phasen der Anleitung

  • Vorbereitung — Sicherungsverzeichnis anlegen · Verbindungspasswort in .pgpass hinterlegen · Zugriff in pg_hba.conf auf dem Standby erlauben · Prüfen, bei welcher Rolle die Verbindungen ankommen · Datenbankgrößen und lang laufende Transaktionen prüfen
  • Wiederherstellung (Import) — Zieldatenbank vorbereiten · Ziel vorbereiten: Extensions, Schemas und Trigger-Funktionen · Wiederherstellen · Unter Überschreiben des Ziels wiederherstellen · Statistiken sammeln (ANALYZE) · Zeilenzahlen vergleichen
  • Nur Schemastruktur (DDL) — DDL-Dump erstellen · Zieldatenbank anlegen · DDL im Ziel anwenden · Prüfen, ob die Strukturen identisch sind
  • Nur Daten — Daten-Dump erstellen · Zieldatenbank anlegen · Tabellenstruktur im Ziel anlegen · Zieltabellen leeren · Daten laden · Statistiken sammeln und Zeilenzahlen vergleichen
  • Sicherung des ganzen Clusters — Globals und alle Datenbanken sichern · Lesbarkeit der Sicherung prüfen
  • Wiederherstellungsprobe (temporärer Test-Cluster) — Testverzeichnis vorbereiten · Temporären Cluster anlegen und starten · Globals laden · Datenbanken laden · ANALYZE und Vergleich der Zeilenzahlen · Temporären Cluster stoppen und entfernen
  • Zugriffsrecht auf dem Quellserver — Zielserver in pg_hba.conf freigeben · Zielserver in pg_hba freigeben (Patroni) · Port in der Firewall für das Ziel öffnen · Anwendung stoppen (Umschaltzeitpunkt)
  • Übertragung auf dem Zielserver — Verbindungspasswort der Quelle in .pgpass hinterlegen · Versions- und Extension-Kompatibilität prüfen · Rollen übertragen (globals) · Datenbanken übertragen (über Dateien, parallel) · Datenbanken übertragen (über eine Pipe) · Statistiken sammeln (ANALYZE) …
  • Nach der Umschaltung — Temporären Zugriff auf der Quelle entfernen · Temporären Zugriff auf der Quelle entfernen (Patroni) · Anwendung auf das Ziel umstellen
  • Einzelne Tabelle aus einem Dump wiederherstellen — Inhalt des Dumps prüfen · Listendatei erstellen (-L) · Zieldatenbank vorbereiten · Tabelle wiederherstellen · Tabelle in die eigentliche Datenbank wiederherstellen · Zeilenzahl vergleichen …
  • Backup-Server und Backup-Rolle — Backup-Rolle anlegen · Leserecht auf Large Objects erteilen · Passwort für die Backup-Rolle setzen · Backup-Server in pg_hba.conf freigeben · Backup-Server in pg_hba freigeben (Patroni) · PostgreSQL-Client-Werkzeuge installieren (Backup-Server) …
  • Sicherungsskript — Volle Pfade der Werkzeuge prüfen · Benachrichtigungswerkzeug installieren · Sicherungsskript schreiben · Skript ausführbar machen · Erste Sicherung von Hand ausführen
  • Zeitplanung (systemd timer) — systemd-Service schreiben · systemd-Timer schreiben · Timer aktivieren und Service von Hand auslösen
  • Zeitplanung (cron) — cron-Dienst vorbereiten · cron-Job schreiben · Rechte der cron-Datei setzen und in einer cron-Umgebung testen · Prüfen, ob cron den Job ausführt
  • Prüfung und Monitoring — Letzte Sicherung in eine Testdatenbank wiederherstellen · Alter der letzten Sicherung überwachen
  • Nächster Schritt: physische Sicherung — Lücken der logischen Sicherung schließen
Schritt-für-Schritt-Plan für Ihre Umgebung öffnen →