pg_dump und psql
Kurz: Zwei offizielle Kommandozeilen-Werkzeuge von PostgreSQL — pg_dump exportiert Daten/Struktur einer Datenbank in eine Datei, psql spielt SQL-Dateien (auch solche Exporte) wieder in eine Datenbank ein.
Genauer: Wichtig: Die installierte pg_dump-Version muss gleich oder neuer als die Server-Version sein, sonst schlägt der Export fehl. Neuere Versionen fügen am Anfang/Ende der Export-Datei \restrict/\unrestrict-Sicherheitsbefehle ein — das ist reine psql-Syntax, kein SQL, und funktioniert deshalb nicht, wenn man den Inhalt in einen reinen Web-SQL-Editor (der nur SQL versteht) pastet.
Kontext bei uns: Damit wurden gezielt vier Tabellen (challenges, custom_roles, rewards, site_settings) aus der alten Bellator-Datenbank exportiert und in die neue Emzett-Neon-Datenbank importiert.
Im Detail
pg_dump kann auf verschiedene Arten exportieren, je nachdem was man später damit vorhat:
# Reines SQL, menschenlesbar, mit psql wieder einspielbar
pg_dump --table=challenges --data-only "$SOURCE_DB_URL" > challenges.sql
# Custom-Format: komprimiert, erlaubt selektiven Restore einzelner Tabellen
pg_dump --format=custom "$SOURCE_DB_URL" > backup.dump
psql "$TARGET_DB_URL" < challenges.sql--schema-only exportiert nur die Tabellenstruktur (CREATE TABLE, Indizes, Constraints) ohne Daten, --data-only nur die Daten (nützlich, wenn das Zielschema schon existiert, z. B. weil Drizzle es bereits per Migration angelegt hat — Doppelt-Anlegen mit CREATE TABLE würde sonst fehlschlagen). Ein häufiger Stolperstein bei Cloud-Datenbanken wie Neon: Der Export enthält standardmäßig auch Rollen-/Owner-Informationen (ALTER TABLE ... OWNER TO ...), die beim Import in eine andere Datenbank mit anderen Rollennamen fehlschlagen können — --no-owner und --no-privileges vermeiden das.
psql als interaktive Konsole
Neben dem reinen “SQL-Datei einspielen” ist psql auch eine vollwertige interaktive Konsole mit eigenen Meta-Befehlen (beginnen mit \, sind KEIN SQL):
psql "$DATABASE_URL"\dt -- alle Tabellen im aktuellen Schema auflisten
\d challenges -- Struktur einer einzelnen Tabelle anzeigen (Spalten, Typen, Indizes)
\timing on -- Ausführungszeit jeder Abfrage anzeigen
\q -- Konsole verlassen
Diese Meta-Befehle sind reine psql-Erweiterungen — sie funktionieren nur in psql selbst, nicht wenn man dieselbe Zeile in ein Programm schickt, das nur echtes SQL versteht (z. B. eine Datenbank-Bibliothek in einer Anwendung).
Fehlerquellen beim Restore
Ein pg_dump-Export schlägt beim Wiedereinspielen typischerweise aus einem von drei Gründen fehl: (1) Versions-Inkompatibilität zwischen der pg_dump-Version, die exportiert hat, und der psql/Server-Version, die importiert (deshalb immer beide aktuell halten), (2) fehlende Extensions auf der Zieldatenbank, falls die Quelldatenbank PostgreSQL-Extensions wie pgcrypto nutzte, oder (3) Foreign-Key-Constraints, die beim Einspielen einzelner Tabellen (statt der kompletten Datenbank) auf noch nicht existierende Zieltabellen verweisen — hier hilft --data-only kombiniert mit vorher bereits per Migration angelegtem Zielschema, da dann alle referenzierten Tabellen schon existieren.