So sichern Sie eine PostgreSQL-Datenbank mit pg_dump

PostgreSQL enthält ein Dienstprogramm namens „pg_dump“, mit dem Datenbankinformationen zu Sicherungszwecken in eine Datei geschrieben werden können.

Das Dienstprogramm pg_dump wird über die Linux-Befehlszeile ausgeführt. Die grundlegende Syntax des Befehls lautet:

pg_dump name_of_database > name_of_backup_file

Der Befehl muss von einem Benutzer mit Berechtigungen zum Lesen aller Datenbankinformationen ausgeführt werden, sodass er die meiste Zeit als Superuser ausgeführt wird.

Als Beispiel aus der Praxis können wir uns beim Benutzer „postgres“ anmelden und den Befehl in der Standarddatenbank ausführen, die auch als „postgres“ bezeichnet wird:

sudo su - postgres
pg_dump postgres > postgres_db.bak

Dieser Befehl ist eigentlich ein PostgreSQL-Client-Programm, sodass er von einem Remote-System ausgeführt werden kann, solange dieses System Zugriff auf die Datenbank hat.
Wenn Sie ein Remote-System sichern möchten, können Sie das Flag „-h“ zur Angabe des Remote-Hosts und das Flag „-p“ übergeben, um den Remote-Port anzugeben:

pg_dump -h remote_host -p remote_port name_of_database > name_of_backup_file

Bei Bedarf können Sie auch einen anderen Benutzer mit der Option „-U“ angeben. Die Syntax wäre:

pg_dump -U user_name -h remote_host -p remote_port name_of_database > name_of_backup_file

Beachten Sie, dass für pg_dump dieselben Authentifizierungsanforderungen gelten wie für jedes andere Client-Programm. Dies bedeutet, dass Sie sicherstellen müssen, dass Ihre Anmeldeinformationen für die Systeme gültig sind, die Sie sichern möchten.

Wiederherstellen von Daten-Dumps aus pg_dump mit PostgreSQL

Um eine von pg_dump erstellte Sicherung wiederherzustellen, können Sie die Datei in die psql-Standardeingabe umleiten:

psql empty_database < backup_file

Hinweis: Durch diese Operation wird die betreffende Datenbank nicht erstellt. Dies muss in einem separaten Schritt erfolgen, bevor der Befehl ausgeführt wird.

createdb -T template0 restored_database
psql restored_database < database.bak

Die leere Datenbank sollte mit "template0" als Basis erstellt werden.

Ein weiterer Schritt, der zur korrekten Wiederherstellung ausgeführt werden muss, besteht darin, alle Benutzer neu zu erstellen, die Objekte in der Datenbank besitzen oder über Berechtigungen verfügen.

Wenn Ihre Datenbank beispielsweise eine Tabelle des Benutzers "test_user" hatte, müssen Sie diese vor dem Import auf dem Wiederherstellungssystem erstellen:

createuser test_user
psql restored_database < database.bak

Umgang mit Wiederherstellungsfehlern
Standardmäßig versucht PostgreSQL, die Wiederherstellung einer Datenbank fortzusetzen, auch wenn unterwegs ein Fehler auftritt.

In vielen Fällen ist dies aus offensichtlichen Gründen unerwünscht. Es kann schmerzhaft sein, herauszufinden, welche Vorgänge erforderlich sind, um den ordnungsgemäßen Zustand der Datenbank wiederherzustellen.

Wir können PostgreSQL anweisen, bei jedem Fehler anzuhalten, indem wir Folgendes eingeben:

psql --set ON_ERROR_STOP=on restored_database < backup_file

Dies führt dazu, dass ein PostgreSQL-Wiederherstellungsvorgang sofort angehalten wird, wenn ein Fehler auftritt.

Dadurch bleibt Ihnen immer noch eine verkrüppelte Datenbank übrig, die noch nicht vollständig wiederhergestellt wurde. Sie können jetzt jedoch Fehler behandeln, sobald sie auftreten, anstatt am Ende eine Liste mit Fehlern zu behandeln.

Eine bessere Option in vielen Situationen kann die Option "-1" (die Nummer eins) oder "--single-transaction" sein:

psql -1 restored_database < backup_file

Diese Option führt alle Wiederherstellungsdetails in einer einzigen Transaktion aus.

Der Unterschied zwischen dieser Option und der Einstellung "ON_ERROR_STOP" besteht darin, dass dies entweder vollständig erfolgreich ist oder nichts importiert.

Dies kann ein kostspieliger Kompromiss für größere Restaurationen sein, aber in vielen Fällen überwiegt der Vorteil, dass Sie keine teilweise wiederhergestellte Datenbank haben, diese Kosten erheblich.