Tworzenie zrzutu bazy danych dla określonych tabel i wpisów Postgres

102

Mam bazę danych z setkami tabel, co muszę zrobić, to wyeksportować określone tabele i wstawić zestawienia danych do jednego pliku sql.

Jedyne stwierdzenie, które wiem, że może to osiągnąć, to

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

Czy powinienem uruchomić tę instrukcję dla każdej tabeli, czy też istnieje sposób na wykonanie podobnej instrukcji, aby wyeksportować wszystkie wybrane tabele do jednego dużego sql. Powyższy pg_dump nie eksportuje schematu tabeli, tylko wstawia, potrzebuję obu

Każda pomoc zostanie doceniona.

Elitmiar
źródło

Odpowiedzi:

169

Bezpośrednio z instrukcji : „ Wiele tabel można wybrać, wpisując wiele przełączników -t

Musisz więc wymienić wszystkie swoje tabele

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

Zauważ, że jeśli masz kilka tabel z tym samym prefiksem (lub sufiksem), możesz również użyć symboli wieloznacznych, aby wybrać je za pomocą -tparametru:

Ponadto parametr table jest interpretowany jako wzorzec zgodnie z tymi samymi regułami, które są używane przez polecenia \ d psql

koń bez imienia
źródło
25
przełącznik -T działa w ten sam sposób, ale służy do wykluczania tabel. Może się przydać, jeśli potrzebujesz wszystkich oprócz jednego lub dwóch stołów itp.
Scott Marlowe,
4
-DOpcja wydaje się, że zniknął w PG 9,1 roku
EPIGENE
5
-DOpcja została usunięta w wersji 8.4 . Zamiast tego musisz użyć --column-insertsteraz.
mlovic
1
Spróbuj pg_dump --host 127.0.0.1 --port 5432 --username "<nazwa użytkownika>" --column-inserts --verbose --file "/ tmp / <filename.sql>" --table "^ <regex> * „„ <tablename> ”
Tharindu Jayasuriya
23

Jeśli te konkretne tabele pasują do określonego wyrażenia regularnego, możesz użyć opcji wyrażenia regularnego w opcji -t w pg_dump.

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

Na przykład, aby zrzucić tabele, które zaczęły się od "test", możesz użyć

pg_dump -D -a -t zones_seq -t interway -t "^test*" -f /tmp/zones_seq.sql <DBNAME>
Jothikanth
źródło
3
jeśli to był regex, czy nie powinien być ^test.*zamiast ^test*?
msrd0
5
To nie jest wyrażenie regularne, używa "wzorców" postgres, więc powinno tak być "test*": postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS
elliotcm
Nie jest trywialne użycie wyrażenia regularnego, generowanie nieprawidłowego wyrażenia regularnego: nieprawidłowy operand kwantyfikatora . Ale wyrażenie regularne jest poprawne ... Tylko bardzo proste wyrażenia regularne są poprawne
Peter Krauss