Trebuie să extrag fișiere SQL din mai multe tabele ale unei baze de date PostgreSQL. Iată cu ce am venit până acum:

Totuși, după cum vedeți, toate tabelele care încep cu prefixul thr sunt exportate într-un singur fișier unificat (db_dump.sql). Am aproape 90 de tabele în total din care să extrag SQL, deci este obligatoriu ca datele să fie stocate în fișiere separate.

Cum o pot face? Mulțumesc anticipat.

4 Răspunsuri 4

Dacă doriți să codificați cu greu lista tabelelor, dar doriți doar ca fiecare să fie într-un fișier diferit, puteți utiliza o buclă de script shell pentru a rula comanda pg_dump de mai multe ori, înlocuind numele tabelului de fiecare dată în jurul buclei:

EDITAȚI | ×: Această abordare poate fi extinsă pentru a obține în mod dinamic lista tabelelor executând o interogare prin psql și introducând rezultatele în buclă în loc de o listă codificată dur:

Aici psql -t -c "SQL" rulează SQL și scoate rezultatele fără antet sau subsol; deoarece există o singură coloană selectată, va exista un nume de tabel pe fiecare linie a ieșirii capturate de $ (comandă), iar shell-ul dvs. va parcurge rândul lor una câte una.

fiecare

De la versiunea 9.1 a PostgreSQL (septembrie 2011), se poate utiliza formatul directorului de ieșire atunci când faceți copii de rezervă

și 2 versiuni/la 2 ani după (PostgreSQL 9.3), --jobs/-j face chiar mai eficientă backupul tuturor obiectelor în paralel

dar ceea ce nu înțeleg în întrebarea dvs. inițială este că utilizați opțiunea -s care aruncă doar definițiile obiectului (schema), nu datele.

dacă doriți datele, nu utilizați -s, ci mai degrabă -a (numai date) sau nicio opțiune pentru a avea schemă + date

deci, pentru a face backup tuturor obiectelor (tabelelor.) care începe cu „th” pentru baza de date dbName din directorul dbName_objects/cu 10 joburi/procese concurente (crește încărcarea pe server):

pg_dump -Fd -f dbName_objects -j 10 -t 'thr_ *' -U UserName dbName

(puteți utiliza și -a/-s dacă doriți datele sau schema obiectelor)

ca rezultat, directorul va fi populat cu un toc.dat (tabelul conținutului tuturor obiectelor) și un fișier per obiect (.dat.gz) într-o formă comprimată

fiecare fișier este numit după numărul obiectului și puteți prelua lista cu următoarea comandă pg_restore:

pg_restore --list -Fd dbName_objects/| grep „DATE DE TABEL”

pentru a nu fi comprimat fiecare fișier (în SQL brut)

pg_dump --data-only --compress = 0 --format = director --file = dbName_objects --jobs = 10 --table = 'thr_ *' --usus = userName --dbname = dbName