Ich muss SQL-Dateien aus mehreren Tabellen einer PostgreSQL-Datenbank extrahieren. Das ist, was ich bis jetzt gefunden habe:
%Vor% Wie Sie jedoch sehen, werden alle Tabellen, die mit dem Präfix thr
beginnen, in eine einzige vereinheitlichte Datei ( db_dump.sql
) exportiert. Ich habe fast 90 Tabellen, um SQL aus zu extrahieren, also ist es ein Muss, dass die Daten in separaten Dateien gespeichert werden.
Wie kann ich es tun? Danke im Voraus.
Wenn Sie gerne die Liste der Tabellen hartcodieren möchten, aber nur jede in einer anderen Datei haben möchten, können Sie eine Shellskriptschleife verwenden, um den Befehl pg_dump
mehrere Male auszuführen, indem Sie jeweils den Tabellennamen ersetzen Zeit um die Schleife:
BEARBEITEN : Dieser Ansatz kann erweitert werden, um die Tabellenliste dynamisch zu erhalten, indem eine Abfrage über psql ausgeführt wird und die Ergebnisse statt einer fest codierten Liste in die Schleife eingegeben werden:
%Vor% Hier läuft psql -t -c "SQL"
auf SQL
und gibt die Ergebnisse ohne Kopf- oder Fußzeile aus; Da nur eine Spalte ausgewählt ist, gibt es in jeder Zeile der Ausgabe, die von $(command)
erfasst wird, einen Tabellennamen, und Ihre Shell durchläuft sie einzeln nacheinander.
(nicht genug Ruf, um den richtigen Beitrag zu kommentieren) Ich habe dein Skript mit einigen Korrekturen und einigen Modifikationen für meinen eigenen Gebrauch benutzt, möglicherweise nützlich für andere:
%Vor%(Ich glaube, Sie haben vergessen, $ DB im Befehl pg_dumb hinzuzufügen, und ich habe ein -w hinzugefügt, für ein automatisiertes Skript ist es besser, keine psw-Eingabeaufforderung zu haben, dafür habe ich ein ~ / erstellt. ppass-Datei mit meinem Passwort drin Ich gab dem Benutzer auch den Befehl, um zu wissen, welches Passwort in .pgpass abgerufen werden soll. Hoffe, das hilft jemandem irgendwann.
Seit der Version 9.1 von PostgreSQL (September 2011) kann man das Verzeichnisformat beim Backup verwenden
und 2 Versionen / 2 Jahre nach (PostgreSQL 9.3), macht es --jobs / -j noch effizienter, jedes einzelne Objekt parallel zu sichern
Was ich jedoch in Ihrer ursprünglichen Frage nicht verstehe, ist, dass Sie die Option -s verwenden, die nur die Objektdefinitionen (Schema) und nicht die Daten ausgibt.
Wenn Sie die Daten möchten, sollten Sie nicht -s verwenden, sondern nur eine Option (nur Daten) oder keine Option, um Schema + Daten zu haben
Also, um alle Objekte (Tabellen ...), die mit 'th' beginnen, für die Datenbank dbName im Verzeichnis dbName_objects / mit 10 gleichzeitigen Jobs / Prozessen zu sichern (Last auf dem Server zu erhöhen):
pg_dump -Fd -f dbName_objects -j 10 -t 'thr_ *' -U Benutzername dbName
(Sie können auch die Option -a / -s verwenden, wenn Sie die Daten oder das Schema der Objekte haben möchten)
Als Ergebnis wird das Verzeichnis mit einer toc.dat (Inhaltstabelle aller Objekte) und einer Datei pro Objekt (.dat.gz) in komprimierter Form
gefülltJede Datei wird nach ihrer Objektnummer benannt, und Sie können die Liste mit dem folgenden Befehl pg_restore abrufen:
pg_restore --list -Fd dbName_objects / | grep 'TABELLENDATEN'
, damit jede Datei nicht komprimiert wird (in Raw SQL)
pg_dump --data-only --compress = 0 --format = Verzeichnis --datei = dbName_objects --jobs = 10 --table = 'thr_ *' --username = benutzername --dbname = dbName
Tags und Links sql database postgresql pg-dump postgresql-9.1