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 mitlocalhost
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.
Hinweis: Wenn du auf einem Mac entwickelst und für die Installation des
PostgreSQL-Servers die PostgresApp benutzt (meine Empfehlung), musst du die der
Serverversion entsprechende Version von pg_dump
benutzen (also pg_dump 11 wenn du
PostgreSQL 11 benutzt). Du kannst dies mit dem ganzen Pfad zu pg_dump
erreichen. Das
sieht dann ungefähr so aus:
/Applications/Postgres.app/Contents/Versions/11/bin/pg_dump -U mein_benutzer meine_datenbank -h localhost > exported_data.sql
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
Schema-Berechtigungen: Obwohl du Berechtigungen für die Datenbank erteilt hast, kann es vorkommen, dass du möglicherweise auch spezifische Berechtigungen für das Schema (in diesem Fall das Schema „public“) gewähren musst. Dies erkennst du an folgendem Output des Ladens der Datenbank: ERROR: permission denied for schema public
. In diesem Fall musst du deinem Datenbankbenutzer noch das Recht für das Schema public
erteilen:
# Verbinde dich mit der Datenbank
\c meine_datenbank
GRANT ALL PRIVILEGES ON SCHEMA public TO mein_datenbankbenutzer;
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
Quellen
- How to import and export a PostgreSQL database (englisch)
- Postgres login: How to log into a Postgresql database (englisch)
- PosgreSQL Dokumentation von drop owned (englisch)
- Exporting and importing data in Django using pg_dump in postgresql, mysqldump in mysql, dumpdata and loaddata commands in Django (englisch)
- Bayerisches Staatsministerium für Unterricht und Kultus: Backup und Restore an der Kommandozeile (Windows) bzw. der Shell (Linux)
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.