2013-08-20 12 views
8

Ho bisogno di estrarre i file SQL da più tabelle di un database PostgreSQL. Questo è ciò che mi è venuta in mente finora:PostgreSQL - scaricare ogni tabella in un file diverso

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

Tuttavia, come si vede, tutte le tabelle che iniziano con il prefisso thr vengono esportati in un unico file unificato (db_dump.sql). Ho quasi 90 tabelle in totale da cui estrarre SQL, quindi è necessario che i dati vengano archiviati in file separati.

Come posso farlo? Grazie in anticipo.

+2

È necessario spiegare * perché * si desidera 90 diversi file - esportazione in MySQL, backup parziale? Se stai tentando di eseguire un backup/esportazione, la risposta di IMSoP non garantirà la stessa istantanea per ogni tabella. –

+0

@RichardHuxton Buon punto, non avevo pensato alla non-atomicità. Suppongo che potresti invece creare un singolo backup "personalizzato" dal DB e quindi estrarre le singole tabelle da quella usando 'pg_restore'. – IMSoP

risposta

13

Se si è soddisfatti di eseguire l'hard-code dell'elenco di tabelle, ma si desidera che ciascuna sia in un file diverso, è possibile utilizzare un ciclo di script della shell per eseguire il comando pg_dump più volte, sostituendo ogni volta il nome della tabella iterazione:

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: Questo approccio può essere esteso per ottenere l'elenco delle tabelle dinamicamente eseguendo una query attraverso psql e alimentando i risultati nel ciclo anziché un elenco hard-coded:

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; 

Quiesegue SQL e restituisce i risultati senza intestazione o piè di pagina; poiché è selezionata una sola colonna, sarà presente un nome di tabella su ogni riga dell'output catturato da $(command) e la shell effettuerà un ciclo attraverso di essi uno alla volta.

+0

Utilizzerò un carattere jolly nel parametro nome tabella. 90 nomi di tabelle con codifica rigida! Sarei un vecchio allora. :) –

+1

@HasanIqbalAnik In alternativa è possibile interrogare il DB dallo script di shell per l'elenco delle tabelle e quindi scorrere l'elenco. –

+0

@HasanIqbalAnik \t Pensavo potessi dirlo, motivo per cui ho aggiunto l'avvertenza all'inizio della risposta. Ho modificato la mia risposta per interrogare il DB per la lista prima, come suggerisce Igor. – IMSoP

0

Questo script bash farà un backup con un file per ogni tabella:

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

(non abbastanza reputazione di commentare il palo destro) ho usato lo script con alcune correzioni e alcune modifiche per il mio uso personale, può essere utile per gli altri:

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

(penso si è dimenticato di aggiungere $ DB nel comando pg_dumb, e ho aggiunto una -w, per uno script automatico, è meglio non avere un prompt PSW immagino , per quello, ho creato un file ~/.pgpass con la mia password Ho anche dato all'utente il comando per sapere quale password recuperare .pgpass) Spero che questo aiuti qualcuno prima o poi.

Problemi correlati