EMZETT.
Login

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.

Siehe auch: Neon, SQL