Die Kom­man­do­zei­len-Tools pg_dump und pg_restore dienen zum Ex­por­tie­ren bzw. Im­por­tie­ren einer Post­greS­QL-Datenbank. Zum Einsatz kommen sie beim Erstellen eines Post­greS­QL-Backups sowie beim Migrieren von Post­greS­QL-Da­ten­ban­ken zwischen Servern.

Worum handelt es sich bei einem Post­greS­QL-Dump?

Unter einem Post­greS­QL-Dump versteht man die Ausgabe-Datei, die beim Export einer Post­greS­QL-Datenbank erzeugt wird. Post­greS­QL ist ein aus­ge­feil­tes Datenbank-Ma­nage­ment-System, das Daten in op­ti­mier­ten Da­ten­struk­tu­ren speichert. Das Ex­tra­hie­ren struk­tu­rier­ter Daten aus einer Post­greS­QL-Datenbank erfordert daher ein spe­zi­el­les Verfahren.

Hinweis

Was ist ein Backup? Diese grund­sätz­li­che Frage be­ant­wor­ten wir in einem anderen Ratgeber.

Ähnlich wie beim MySQL-Backup via MySQL-Dump erzeugt das pg_dump-Tool eine Textdatei mit SQL-An­wei­sun­gen. Das Ausführen der An­wei­sun­gen stellt die Datenbank zum Zeitpunkt des Dumps wieder her. In den Worten der of­fi­zi­el­len Post­greS­QL-Do­ku­men­ta­ti­on:

Zitat

„The idea behind this dump method is to generate a text file with SQL commands that, when fed back to the server, will recreate the database in the same state as it was at the time of the dump.“

„Die Idee hinter dieser Dump-Methode besteht darin, eine Textdatei mit SQL-An­wei­sun­gen zu ge­ne­rie­ren, die, wenn sie am Server wieder ein­ge­spielt wird, die Datenbank zu dem Zustand wie­der­her­stellt, an dem sie sich zum Zeitpunkt des Dumps befand.“

(https://www.post­gres­ql.org/docs/9.1/backup-dump.html, übersetzt von IONOS)

Es ist wichtig, zu verstehen, was mit „Post­greS­QL-Datenbank“ gemeint ist. Der Begriff wird oft ver­wech­selt mit dem Post­greS­QL-Server. In der Tat ist es nicht un­ge­wöhn­lich, dass ein einzelner Post­greS­QL-Server mehrere Da­ten­ban­ken enthält. Hier die Hier­ar­chie der Objekte einer Post­greS­QL-In­stal­la­ti­on im Überblick:

Post­greS­QL-Objekt Enthält
Server Da­ten­ban­ken
Datenbank Tabellen
Tabelle Da­ten­sät­ze
Datensatz Felder

Wie funk­tio­nie­ren pg_dump und pg_restore?

Die Kom­man­do­zei­len-Tools pg_dump und pg_restore werden für ge­wöhn­lich als Teil der Post­greS­QL-Client-An­wen­dun­gen mitsamt der Post­greS­QL-Kom­man­do­zei­len-Schnitt­stel­le psql in­stal­liert. Die Tools folgen der Unix-Phi­lo­so­phie und nutzen Text­strö­me für Ein- und Ausgabe. Dies er­mög­licht, sie durch so­ge­nann­te Pipes mit anderen Pro­gram­men zu ver­knüp­fen. Ferner lassen sich Ein- und Ausgabe mittels Um­lei­tun­gen aus Dateien lesen bzw. an Dateien ausgeben.

Wir zeigen das generelle Muster bei der Nutzung von pg_dump zum Erzeugen eines Post­greS­QL-Dumps:

pg_dump dbname > db.dump

Wir nutzen eine Umleitung der Ausgabe ('>') an eine Datei. Der dabei erzeugte Post­greS­QL-Dump enthält SQL-An­wei­sun­gen. Diese lassen sich mit dem psql-Tool ausführen. Wir zeigen das generelle Muster bei der Nutzung von psql zum Einlesen eines Post­greS­QL-Dumps:

psql dbname < db.dump

Wie Sie sehen, erfolgt der Aufruf analog zum Aufruf von pg_dump. Jedoch nutzen wir eine Umleitung der Eingabe ('<') aus der Post­greS­QL-Dump-Datei.

Das pg_dump-Tool kann noch einiges mehr. So ist es möglich, Da­ten­ban­ken in spe­zi­el­len Dump-Formaten aus­zu­ge­ben. Je nach Format des erzeugten Post­greS­QL-Dumps wird das pg_restore- oder psql-Tool zum Wie­der­her­stel­len benötigt.

Hier ein Überblick der beim Erstellen und Wie­der­her­stel­len von Post­greS­QL-Backups zum Einsatz kommenden Kom­man­do­zei­len-Tools:

Tool Erklärung
pg_dump Kom­man­do­zei­len-Tool zum Erstellen eines Post­greS­QL-Dumps
pg_restore Kom­man­do­zei­len-Tool zum Wie­der­her­stel­len einer Post­greS­QL-Datenbank aus einem Post­greS­QL-Dump; erlaubt ggf. spezielle Ope­ra­tio­nen wie partielle Imports, Um­sor­tie­ren der Import-Daten, par­al­le­len Import mehrerer Tabellen etc.
psql Post­greS­QL-Kom­man­do­zei­len-Schnitt­stel­le; nimmt SQL-An­wei­sun­gen von der Kom­man­do­zei­le oder aus einer Post­greS­QL-Dump-Datei entgegen und führt diese aus

Be­trach­ten wir das generelle Muster bei der Nutzung von pg_restore zum Wie­der­her­stel­len eines Post­greS­QL-Dumps:

pg_restore --dbname=dbname db.dump

Die Nutzung von pg_restore erfordert das Erzeugen des Post­greS­QL-Dumps in einem spe­zi­el­len Format. Schauen wir uns die möglichem Aus­ga­be­for­ma­te von pg_dump an:

pg_dump-Aus­ga­be­for­mat Erklärung Import via
Plain Plain-Text-Datei mit SQL-An­wei­sun­gen; Kom­pri­mie­ren erfordert weiteres Tool wie Gzip psql
Custom Kom­pri­mier­tes Dump-Format; Import lässt sich im Detail steuern pg_restore
Directory Erstellt Ver­zeich­nis mit je einer Datei pro Tabelle/Blob; zu­sätz­lich In­halts­ver­zeich­nis; Llsst sich mit Standard-Unix-Tools be­ar­bei­ten; erlaubt par­al­le­len Export mehrerer Tabellen pg_restore
Tar Ar­chi­vie­rungs­for­mat „Tape Archive“; lässt sich in Directory-Format umwandeln; Kom­pri­mie­ren erfordert weiteres Tool wie Gzip; Abfolge der Imports nicht steuerbar pg_restore

Ab­schlie­ßend das generelle Muster beim Aufruf von pg_dump zur Er­stel­lung eines Post­greS­QL-Dumps im „Custom“-Dump-Format:

pg_dump --format=custom dbname > db.dump
Tipp

Wenn Ihre Post­greS­QL-In­stal­la­ti­on in einem Docker-Container läuft, können Sie pg_dump innerhalb des Con­tai­ners verwenden, um ein Post­greS­QL-Backup anzulegen. Es gibt auch die Mög­lich­keit, den gesamten Container als Docker-Backup zu speichern. Wie das geht, erklären wir in unserem De­tail­ar­ti­kel.

Schritt-für-Schritt-Anleitung zum Erstellen und Wie­der­her­stel­len eines Post­greS­QL-Backups

Es gibt un­ter­schied­li­che Wege, Post­greS­QL-Backups anzulegen und wie­der­her­zu­stel­len. Je nach Ein­satz­sze­na­rio und An­for­de­run­gen bieten die Methoden ver­schie­de­ne Vor- und Nachteile. Das Vorgehen beim Erstellen des Post­greS­QL-Dumps bestimmt darüber, welche Methode beim Import zum Einsatz kommt.

Bevor wir uns mit der spe­zi­fi­schen Methode zum Anlegen und Wie­der­her­stel­len von Post­greS­QL-Dumps be­schäf­ti­gen, ein kleiner Hinweis: Die nach­fol­gen­den Beispiele re­fe­ren­zie­ren lediglich den Namen der zu nutzenden Datenbank. Sie enthalten jedoch keine Datenbank-Nut­zer­na­men oder -Pass­wör­ter. Diese sind bei Post­greS­QL der Kon­ven­ti­on folgend in der Passwort-Datei .pgpass abgelegt. Die Datei befindet sich im Heim­ver­zeich­nis des Nutzers und enthält Post­greS­QL-Ver­bin­dungs­da­ten. Dabei kommt das folgende Format zum Einsatz:

hostname:port:database:username:password

Die in der Passwort-Datei ent­hal­te­nen In­for­ma­tio­nen werden au­to­ma­tisch bei Aufruf der Kom­man­do­zei­len-Tools genutzt. So entfällt das riskante Angeben sensibler Daten auf der Kom­man­do­zei­le.

Über­prü­fen, ob Tools vorhanden sind, und diese ggf. in­stal­lie­ren

Vorab über­prü­fen wir, ob pg_dump und pg_restore in­stal­liert sind. Wir versuchen, die Tools auf­zu­ru­fen und deren Version aus­zu­ge­ben. Schlägt dies fehl, dann fehlt das Tool und muss in­stal­liert werden.

  • Über­prü­fen, ob pg_dump in­stal­liert ist:
pg_dump --version
  • Über­prü­fen, ob pg_restore in­stal­liert ist:
pg_restore --version
  • Ferner über­prü­fen wir, ob die Post­greS­QL-Kom­man­do­zei­len­schnitt­stel­le psql in­stal­liert ist:
psql --version

Sollten die Tools nicht gefunden werden, lassen sie sich leicht in­stal­lie­ren.

  • Auf dem Mac in­stal­lie­ren wir die Post­greS­QL-Client-An­wen­dun­gen mit Homebrew:
brew install libpq
brew link --force libpq
  • Unter Ubuntu-Linux nutzen wir die ein­ge­bau­te Pa­ket­ver­wal­tung:
sudo apt-get install postgresql-client

Post­greS­QL-Backup erstellen und wie­der­her­stel­len

Schauen wir uns zunächst das ein­fachs­te Szenario zum Erstellen eines Post­greS­QL-Backups an. Dabei ex­tra­hie­ren wir eine einzelne Datenbank von einem Post­greS­QL-Server. Struktur und Inhalte der Datenbank werden dabei in Form von SQL-An­wei­sun­gen in eine Datei ge­schrie­ben. Der folgende Aufruf des pg_dump-Tools leistet genau das:

pg_dump dbname > db.dump

Wie sieht es nun aus, wenn man den erzeugten Post­greS­QL-Dump auf einem anderen Server wie­der­her­stel­len möchte? Zu diesem Zweck kommt die Post­greS­QL-Kom­man­do­zei­len-Schnitt­stel­le psql zum Einsatz. Der Befehl ist denkbar einfach:

psql dbname < db.dump

Neben der Ausgabe eines Post­greS­QL-Dumps als Textdatei mit SQL-An­wei­sun­gen erlaubt das pg_dump-Tool das Erzeugen spe­zia­li­sier­ter Post­greS­QL-Dump-Formate. Diese werden beim Aufruf über Optionen gesteuert. Hier ein Überblick der beiden nütz­lichs­ten Dump-Formate:

Post­greS­QL-Dump-Format Aus­führ­li­che Options-Syntax Kurze Options-Syntax
Custom pg_dump --format=custom pg_dump -Fc
Directory pg_dump --format=directory pg_dump -Fd

Wir erstellen einen Post­greS­QL-Dump im Custom-Format:

pg_dump --format=custom dbname > db.dump

Zum Wie­der­her­stel­len an einem anderen Server nutzt man das pg_restore-Tool:

pg_restore --dbname=dbname db.dump

Möchte man den Post­greS­QL-Dump am selben Server wie­der­her­stel­len, erfordert dies einen zu­sätz­li­chen Schritt. Denn Datenbank und Tabellen sind auf dem Server bereits vorhanden und müssen vor dem Import entfernt werden. Kon­zep­tu­ell ist das ähnlich wie '--add-drop-tables' bei MySQL-Dump. Prak­ti­scher­wei­se lässt sich bei Post­greS­QL die Funk­tio­na­li­tät beim Im­por­tie­ren hin­zu­schal­ten:

pg_restore --clean --create --dbname=dbname db.dump

Die Option '--clean' entfernt eine exis­tie­ren­de Datenbank vor dem Import; mit der Option '--create' erstellen wir die Datenbank unter dem an­ge­ge­be­nen Namen. So läuft der Import ohne Kol­li­sio­nen ab.

Post­greS­QL-Datenbank zwischen ent­fern­ten Servern migrieren

Export und Import eines Post­greS­QL-Dumps lassen sich über eine Pipe ('|') verbinden. So werden die ex­por­tier­ten Daten direkt in den Import ein­ge­speist. Da pg_dump, pg_restore und psql bei Bedarf auf einem ent­fern­ten Host operieren, ist es möglich, den Export von einem Server direkt auf einem anderen Server zu im­por­tie­ren. Schauen wir uns den dafür ver­wen­de­ten Be­fehls­auf­ruf an. Wir nutzen die Option '--host', um die Host-Namen anzugeben:

pg_dump --host=export_host dbname | psql --host=import_host dbname

Post­greS­QL-Backup großer Da­ten­ban­ken erstellen

Bei Post­greS­QL handelt es sich um ein pro­fes­sio­nel­les Datenbank-Ma­nage­ment-System. Um Backups um­fang­rei­cher Da­ten­ban­ken anzulegen, wird ein spe­zi­el­les Vorgehen benötigt. Denn erzeugte Post­greS­QL-Dumps können sehr groß werden. Zunächst bietet sich an, Kom­pri­mie­rung zu nutzen. Als Textdatei ex­por­tier­te Post­greS­QL-Dumps enthalten für ge­wöhn­lich große Mengen red­un­dan­ter SQL-An­wei­sun­gen. Diese lassen sich gut kom­pri­mie­ren.

Wir leiten die Ausgabe von pg_dump per Pipe an das Gzip Kom­pres­si­ons-Tool weiter und schreiben an­schlie­ßend in eine kom­pri­mier­te .gz-Datei:

pg_dump dbname | gzip > db.dump.gz

Zum Wie­der­her­stel­len aus einem kom­pri­mier­ten Post­greS­QL-Dump drehen wir den Prozess um. Das Gunzip-Tool entpackt die kom­pri­mier­ten Daten und gibt diese an die Stan­dard­aus­ga­be aus. Wir leiten die Ausgabe per Pipe an das psql-Tool weiter. Beim Entpacken nutzen wir die Option '-c', um die Ein­ga­be­da­tei unberührt zu lassen:

gunzip -c db.dump.gz | psql dbname

Die 3-2-1-Backup-Regel erfordert min­des­tens ein Backup in der Cloud. Der Upload sehr großer Dateien kann unter gewissen Umständen pro­ble­ma­tisch sein. Ggf. ist es sinnvoll, das Post­greS­QL-Dump mit dem split-Tool in mehrere Dateien zu zerlegen. Wiederum nutzen wir eine Pipe, um die Ausgabe von pg_dump an split wei­ter­zu­lei­ten. In unserem Beispiel spalten wir den Post­greS­QL-Dump in einzelne Dateien mit einer maximalen Größe von 1 GB:

pg_dump dbname | split -b 1G - db.dump

Wie lassen sich die beim Import durch split erzeugten par­ti­el­len Dateien wieder zu­sam­men­füh­ren? Hierfür wird keine spezielle Software benötigt; statt­des­sen nutzen wir das Standard-cat-Tool. Wir übergeben eine Liste der par­ti­el­len Post­greS­QL-Dumps, die vom cat-Tool zu einem zu­sam­men­hän­gen­den Da­ten­strom kom­bi­niert werden. Diesen leiten wir wie gehabt per Pipe an psql weiter:

cat db.dump* | psql dbname

Bei Ver­wen­dung des Directory-Dump-Formats ist es möglich, mehrere Tabellen parallel zu dumpen. Das geht schneller, führt jedoch auch zu einer höheren Last am Datenbank-Server. Über die Option '--jobs' steuern wir die Anzahl parallel ex­por­tier­ter Tabellen. In unserem Beispiel ex­por­tie­ren wir drei Tabellen parallel. Da wir ein Ver­zeich­nis schreiben, ist es nicht möglich, die Ausgabe an eine Datei um­zu­lei­ten. Statt­des­sen nutzen wir die Option '--file' mit Angabe des Ver­zeich­nis­na­mens:

pg_dump --jobs=3 --format=directory --file=dump.dir dbname
Zum Hauptmenü