2013-08-20 7 views
8

Ich muss SQL-Dateien aus mehreren Tabellen einer PostgreSQL-Datenbank extrahieren. Dies ist, was ich mit so weit habe kommen:PostgreSQL - dump jede Tabelle in eine andere Datei

pg_dump -t 'thr_*' -s dbName -U userName > /home/anik/psqlTest/db_dump.sql 

Doch wie Sie sehen, alle Tabellen, die thr mit dem Präfix beginnen zu einer einheitlichen Datei exportiert werden (db_dump.sql). 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.

+2

Sie müssen erklären, warum * Sie wollen 90 verschiedene Dateien - Export zu MySQL, Teilsicherung? Wenn Sie versuchen, einen Backup/Export durchzuführen, garantiert die Antwort von IMSoP nicht den gleichen Snapshot für jede Tabelle. –

+0

@RichardHuxton Guter Punkt, ich hatte nicht an die Nichtatomizität gedacht. Ich nehme an, Sie könnten stattdessen ein einzelnes "benutzerdefiniertes" Backup von der Datenbank erstellen und dann die einzelnen Tabellen daraus mit 'pg_restore' extrahieren. – IMSoP

Antwort

13

Wenn Sie gerne die Liste der Tabellen fest codieren, aber nur jede in einer anderen Datei haben möchten, können Sie den Befehl pg_dump mithilfe einer Shellskriptschleife mehrmals ausführen und dabei jeweils den Tabellennamen ersetzen die Schleife:

for table in table1 table2 table3 etc; 
do pg_dump -t $table -U userName dbName > /home/anik/psqlTest/db_dump_dir/$table.sql; 
done; 

EDIT: Dieser Ansatz kann erweitert werden, um die Liste der Tabellen dynamisch zu erhalten, indem eine Abfrage durch psql ausgeführt und die Ergebnisse in die Schleife Fütterung anstelle einer hartcodierte Liste:

for table in $(psql -U userName -d dbName -t -c "Select table_name From information_schema.tables Where table_type='BASE TABLE' and table_name like 'thr_%'"); 
do pg_dump -t $table -U userName dbName > /home/anik/psqlTest/db_dump_dir/$table.sql; 
done; 

Hier psql -t -c "SQL" läuft 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 nacheinander.

+0

Ich werde einen Platzhalter in Tabellenname Parameter verwenden. Harte Codierung 90 Tabellennamen! Ich wäre bis dahin ein alter Mann. :) –

+1

@HasanIqbalAnik Alternativ können Sie die DB aus Shell-Skript für die Liste der Tabellen abfragen und dann durch die Liste durchlaufen. –

+0

@HasanIqbalAnik \t Ich dachte, Sie könnten das sagen, weshalb ich den Vorbehalt zu Beginn der Antwort hinzugefügt habe. Ich habe meine Antwort bearbeitet, um zuerst die Datenbank nach der Liste abzufragen, wie Igor vorschlägt. – IMSoP

0

mit einer Datei pro Tabelle Dieses Bash-Skript wird eine Sicherung tun:

#!/bin/bash 

# Config: 
DB=dbName 
U=userName 
# tablename searchpattern, if you want all tables enter "": 
P="" 
# directory to dump files without trailing slash: 
DIR=~/psql_db_dump_dir 

mkdir -p $DIR 
AUTH="-d $DB -U $U" 
TABLES="$(psql -d $DB -U $U -t -c "SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE' AND table_name LIKE '%$P%' ORDER BY table_name")" 
for table in $TABLES; do 
    echo backup $table ... 
    pg_dump $ -t $table > $DIR/$table.sql; 
done; 
echo done 
0

ich für meinen eigenen Gebrauch mit einigen Korrekturen und einigen Modifikationen verwendet Ihr Skript (nicht genug Ruf den rechten Pfosten kommentieren) kann für andere nützlich sein:

#!/bin/bash 

# Config: 
DB=rezopilotdatabase 
U=postgres 
# tablename searchpattern, if you want all tables enter "": 
P="" 
# directory to dump files without trailing slash: 
DIR=~/psql_db_dump_dir 

mkdir -p $DIR 
TABLES="$(psql -d $DB -U $U -t -c "SELECT table_name FROM 
information_schema.tables WHERE table_type='BASE TABLE' AND table_name 
LIKE '%$P%' ORDER BY table_name")" 
for table in $TABLES; do 
    echo backup $table ... 
    pg_dump $DB -U $U -w -t $table > $DIR/$table.sql; 
done; 
echo done 

(ich glaube, Sie haben vergessen $ DB im pg_dumb Befehl hinzufügen, und ich fügte ich denke, ein -w, für ein automatisiertes Skript, es ist besser, nicht eine PSW prompt haben Dafür habe ich eine ~/.pgpass-Datei mit meinem Passwort erstellt Ich gab auch den Benutzer für den Befehl, um zu wissen, welches Passwort in .pgpass holen) Hoffe, das hilft jemandem irgendwann.