2013-08-20 29 views
8

Potrzebuję wyodrębnić pliki SQL z wielu tabel bazy danych PostgreSQL. To, co mam wymyślić do tej pory:PostgreSQL - zrzuć każdą tabelę do innego pliku

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

Jednak, jak widać, wszystkie tabele, które rozpoczynają się od prefiksu thr są eksportowane do jednego pliku zunifikowanej (db_dump.sql). Mam prawie 90 tabel w sumie, aby wyodrębnić SQL z, więc jest to konieczne, aby dane były przechowywane w osobnych plikach.

Jak mogę to zrobić? Z góry dziękuję.

+2

Musisz wyjaśnić, * dlaczego * chcesz 90 różnych plików - eksport do MySQL, częściowa kopia zapasowa? Jeśli próbujesz wykonać kopię zapasową/eksport, odpowiedź IMSoP nie gwarantuje tej samej migawki dla każdej tabeli. –

+0

@RichardHuxton Dobra uwaga, nie myślałem o nieatomowości. Przypuszczam, że można zamiast tego utworzyć pojedynczą "niestandardową" kopię zapasową z bazy danych, a następnie wyodrębnić z niej poszczególne tabele, używając 'pg_restore'. – IMSoP

Odpowiedz

13

Jeśli chcesz wydrukować listę tabel, ale chcesz, aby każdy znajdował się w innym pliku, możesz użyć pętli skryptu powłoki, aby wielokrotnie uruchamiać polecenie pg_dump, zastępując w nazwie tabeli za każdym razem okrągły pętli:

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: Takie podejście może być przedłużony, aby uzyskać listę tabel dynamicznie uruchamiając zapytanie poprzez psql i karmienie wyniki do pętli zamiast zakodowanej listy:

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; 

Tutaj psql -t -c "SQL" działa SQL i wysyła wyniki bez nagłówka lub stopki; ponieważ wybrana jest tylko jedna kolumna, w każdym wierszu danych wyjściowych przechwyconych przez $(command) będzie wyświetlana nazwa tabeli, a twoja powłoka będzie je przeglądać po jednej na raz.

+0

Będę używał wieloznacznika w parametrze nazwy tabeli. Twarde kodowanie 90 nazw stołów! Do tego czasu byłbym starcem. :) –

+1

@HasanIqbalAnik Alternatywnie możesz zapytać DB ze skryptu powłoki o listę tabel, a następnie przeglądać listę. –

+0

@HasanIqbalAnik \t Myślałem, że możesz tak powiedzieć, dlatego dodałem zastrzeżenie na początku odpowiedzi. Edytowałem swoją odpowiedź, aby najpierw zapytać o DB dla listy, jak sugeruje Igor. – IMSoP

0

Ten skrypt bash zrobi kopię zapasową z jednego pliku na stole:

#!/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

(nie wystarczy reputacji komentować prawego słupka) użyłem skryptu z pewnymi poprawkami i pewnymi modyfikacjami na własny użytek, mogą być przydatne dla innych:

#!/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 

(myślę, że zapomniał dodać $ db w poleceniu pg_dumb i dodałem -w, dla zautomatyzowanego skryptu, to lepiej nie mieć wiersz PSW Chyba , w tym celu utworzyłem plik ~/.pgpass z moim hasłem Podałem też użytkownikowi polecenie, aby dowiedzieć się, które hasło pobrać w .pgpass). Mam nadzieję, że to pomoże komuś kiedyś.