Membuat dump database untuk tabel dan entri tertentu Postgres

95

Saya memiliki database dengan ratusan tabel, yang perlu saya lakukan adalah mengekspor tabel tertentu dan memasukkan pernyataan untuk data ke satu file sql.

Satu-satunya pernyataan yang saya tahu bisa mencapai ini adalah

pg_dump -D -a -t zones_seq interway > /tmp/zones_seq.sql

Haruskah saya menjalankan pernyataan ini untuk setiap tabel atau apakah ada cara untuk menjalankan pernyataan serupa untuk mengekspor semua tabel yang dipilih menjadi satu sql besar besar. Pg_dump di atas tidak mengekspor skema tabel yang hanya menyisipkan, saya membutuhkan keduanya

Bantuan apa pun akan dihargai.

Elitmiar
sumber

Jawaban:

161

Langsung dari manual : " Beberapa tabel dapat dipilih dengan menulis beberapa tombol -t "

Jadi, Anda perlu membuat daftar semua tabel Anda

pg_dump --column-inserts -a -t zones_seq -t interway -t table_3 ... > /tmp/zones_seq.sql  

Perhatikan bahwa jika Anda memiliki beberapa tabel dengan awalan (atau akhiran) yang sama, Anda juga dapat menggunakan karakter pengganti untuk memilihnya dengan -tparameter:

" Selain itu, parameter tabel diinterpretasikan sebagai pola sesuai dengan aturan yang sama yang digunakan oleh perintah \ d psql "

seekor kuda tanpa nama
sumber
21
tombol -T adalah cara yang sama tetapi digunakan untuk mengecualikan tabel. Mungkin berguna jika Anda membutuhkan semua kecuali satu atau dua tabel, dll.
Scott Marlowe
4
The -Dpilihan tampaknya telah menghilang di PG 9.1 dan seterusnya
Epigene
5
The -Dpilihan itu dihapus dalam versi 8.4 . Anda harus menggunakan --column-insertssekarang sebagai gantinya.
mlovic
1
Coba pg_dump --host 127.0.0.1 --port 5432 --username "<username>" --column-inserts --verbose --file "/ tmp / <filename.sql>" --table "^ <regex> * "" <tablename> "
Tharindu Jayasuriya
22

Jika tabel spesifik tersebut cocok dengan regex tertentu, Anda dapat menggunakan opsi regex in -t di pg_dump.

pg_dump -D -a -t zones_seq -t interway -t "<regex>" -f /tmp/zones_seq.sql <DBNAME>

Misalnya untuk membuang tabel yang dimulai dengan "test", Anda bisa menggunakan

pg_dump -D -a -t zones_seq -t interway -t "^test*" -f /tmp/zones_seq.sql <DBNAME>
Jothikanth
sumber
3
apakah itu regex, tidak harus itu ^test.*bukan ^test*?
msrd0
5
Ini bukan regex, ini menggunakan "pola" postgres, jadi seharusnya "test*": postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS
elliotcm
Tidak sepele untuk menggunakan regex, menghasilkan ekspresi reguler yang tidak valid: kesalahan operasi pengukur kuantitas tidak valid . Tapi ekspresi reguler benar ... Hanya regex yang sangat sederhana yang valid
Peter Krauss