PostgreSQL - lade jede Tabelle in eine andere Datei

8

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.

    
Hasan Iqbal Anik 20.08.2013, 08:27
quelle

4 Antworten

13

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:

%Vor%

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.

    
IMSoP 20.08.2013, 08:44
quelle
0

Dieses Bash-Skript erstellt eine Sicherungskopie mit einer Datei pro Tabelle:

%Vor%     
rubo77 23.03.2017 07:25
quelle
0

(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.

    
Rousseau Alban 14.04.2017 11:20
quelle
0

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üllt

Jede 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

    
Cyril Chaboisseau 23.03.2018 16:17
quelle