Exportieren und Importieren einer PostgreSQL-Datenbank mithilfe der Befehlszeile

  • 16. Februar 2022

Wenn man ein Projekt von der lokalen Festplatte auf einen Live-Server migrieren will oder eine Webseite von einem Host zu einem anderen zügelt, muss immer auch die Datenbank mit. Bei einer Django-Webseite ist dies meist eine PostgreSQL-Datenbank. Wie die Migration mithilfe der Befehlszeile gelingt, beschreibe ich in diesem Beitrag.

Die Migration einer PostgreSQL-Datenbank ist keine grosse Sache, wenn man weiss wie. In der Vergangenheit bin ich dennoch ein paar Mal über die Details gestolpert. Mit dem in diesem Beitrag vorgestellten Vorgehen gelingt das Migrieren mühelos. Wir benutzen dazu die Befehlszeile und das PostgreSQL-Programm pg_dump.

Exportieren der Daten

Bevor wir die Datenbank-Daten auf den neuen PostgreSQL-Server kopieren können, müssen wir sie im Textformat exportieren. Diese Datei können wir dann auf dem Zielcomputer/Zielhost importieren.

Verbinden mit dem Datenbank-Host

Zuerst müssen wir uns mit dem Datenbank-Host verbinden. Starte dazu die Befehlszeile. Bist du auf dem lokalen Computer, navigierst du am besten zum Verzeichnis mit dem Projekt, von welchem du die Datenbank exportieren möchtest. Wenn sich das Projekt auf einem Server befindet, verbinde dich per SSL mit dem entfernten Datenbank-Host beziehungsweise Web-Server.

Exportieren der Datenbank in eine Textdatei

Um die Datenbank zu exportieren, benutze ein Kommando in folgendem Format:

pg_dump -U <db_benutzername> <db_name> -h <host> > exported_data.sql

Die Optionen haben folgende Bedeutung:

  • -U <db_benutzername> = der Benutzername, mit dem zur Datenbank verbunden werden soll. Dieser Benutzer muss alle Privilegien über die Datenbank haben.
  • -h host = bezeichnet den Hostnamen des Computers, auf dem der Datenbank-Server läuft. In unserem Fall ist der Server auf der gleichen Maschine installiert, deshalb können wir uns mit localhost verbinden.

Das sieht dann für ein Projekt so aus:

pg_dump -U mein_benutzer meine_datenbank -h localhost > exported_data.sql

Wir verbinden uns hier mit dem Benutzer mein_benutzer mit der Datenbank meine_datenbank, welche auf dem localhost installiert ist.

Du wirst jetzt nach dem Passwort von mein_benutzer gefragt. Nach der korrekten Eingabe wird dein Datenbank-Dump mit dem Namen exported_data.sql an der Stelle, wo deine Befehlszeilen-Eingabe steht, erstellt. Das ist dort, wo du dich mit der Befehlszeile im Dateisystem befindest. Du kannst mit dem Befehl pwd herausfinden, wo das ist.

Importieren der Daten

Kopiere zuerst die Datei exportet_data.sql an den neuen Ort. Dies kann zum Beispiel der Fall sein, wenn du das Projekt live schalten möchtest, du mit den Daten aus der Produktion auf einem Test-System arbeiten willst, oder du ein Back-up nach einem Absturz des Systems wieder einspielen musst.

Bereits existierende Datenbank löschen

Wenn am neuen Ort bereits eine Datenbank mit dem gleichen Namen existiert, würde ich diese zuerst löschen. Möglich wäre aber auch den Inhalt mit dem Befehl drop owned zu entfernen (die Dokumentation dazu findest du hier).

Um die Datenbank zu löschen, meldest du dich an einer interaktiven PSQL-Session anmelden. Das machst du mit folgendem Befehl:

sudo -u postgres psql

Wenn du checken möchtest, ob deine Datenbank bereits existiert, kannst du eine Liste aller vom PostgreSQL-Server verwalteten Datenbanken anzeigen lassen:

\l

Lösche jetzt die Datenbank:

DROP DATABASE meine_datenbank;  # meine_datenbank ist der Name der Datenbank

Erstellen einer neuen Datenbank

Um eine neue, leere, Datenbank zu erstellen, tippe folgenden Befehl:

CREATE DATABASE meine_datenbank;

Falls du den Datenbank-Benutzer noch nicht angelegt hast, mache das jetzt:

CREATE USER mein_benutzer WITH PASSWORD 'mein_passwort';

Erteile dem Datenbank-Benutzer alle Berechtigungen für die Datenbank:

GRANT ALL PRIVILEGES ON DATABASE meine_datenbank TO mein_benutzer;

Schliesse die PSQL-Session:

\q

Datenbank-Dump in die Datenbank laden

Um die Daten aus dem Datenbank-Dump in die Datenbank einzuspielen, benutzt du einen Befehl mit folgender Syntax:

# Mac / Linux
psql -U <db_benutzer> <db_name> -h <host> < exported_data.sql
# Windows
psql -h hostname -p port_number -U <db_benutzer> -f exported_data.sql <db_name>

In unserem Fall könnte das so aussehen:

# Mac / Linux
psql -U mein_benutzer meine_datenbank -h localhost < exported_data.sql
# Windows
psql -h localhost -p 5432 -U mein_benutzer -f exported_data.sql meine_datenbank

Du wirst jetzt nach dem Passwort gefragt. Nach Eingabe des Passworts werden die Daten aus der Textdatei, dem Datenbank-Dump, in die Datenbank eingelesen und du solltest eine Ausgabe wie folgt sehen:

Passwort für Benutzer mein_benutzer: SET
SET
 set_config ------------
(1 Zeile)
SET
SET
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
(...)
(...)
(...)

Überprüfen, ob alles wie erwartet funktioniert

Um zu testen, ob alles wie erwartet funktioniert und die Datenbank in einem guten Zustand ist, starte die virtuelle Umgebung deines Django-Projektes und gib folgenden Befehl in die Befehlszeile ein:

python manage.py check

Alternativ kannst du auch gleich das Projekt mit python manage.py runserver starten. Wenn keine Fehlermeldung angezeigt wird, sollte alles funktionieren. Um dies zu überprüfen, kannst du einen manuellen Check der Webseite vornehmen. Wenn du dich auf einem Webserver befindest, empfiehlt es sich das Django-Projekt und den Webserver, z.B. nginx oder Apache neu zu starten.

Zusammenfassung

Wie man sieht, ist das Exportieren und Importieren einer PostgreSQL-Datenbank kein Hexenwerk und doch sind einige Schritte involviert. Hier die wichtigsten nochmals in der Übersicht:

  • Exportieren der Datenbank in eine Textdatei
  • Kopieren der Daten an den neuen Ort
  • Löschen (leeren) einer bereits existierenden Datenbank
  • Erstellen der neuen Datenbank
  • Importieren der Daten in die Datenbank
  • Überprüfen des Imports

 

Das könnte dich auch interessieren

PostgreSQL Cheat Sheet

  • 19. Februar 2022

Wenn man eine PostgreSQL-Datenbank mit seiner Django-App benutzt, ist es manchmal nötig, direkt mit der Datenbank zu arbeiten. Damit ich nicht immer das Internet bemühen muss, habe ich mir einen Spickzettel (Cheat Sheet) mit den meistverwendeten Befehlen zusammengestellt.