Criação de um dump de banco de dados para tabelas e entradas específicas Postgres

102

Eu tenho um banco de dados com centenas de tabelas, o que preciso fazer é exportar tabelas especificadas e inserir instruções para os dados em um arquivo sql.

A única afirmação que sei que pode fazer isso é

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

Devo executar esta instrução para cada tabela ou existe uma maneira de executar uma instrução semelhante para exportar todas as tabelas selecionadas em um grande sql big. O pg_dump acima não exporta o esquema da tabela apenas inserções, eu preciso de ambos

Qualquer ajuda será apreciada.

Elitmiar
fonte

Respostas:

169

Direto do manual : " Múltiplas tabelas podem ser selecionadas escrevendo várias opções -t "

Então você precisa listar todas as suas tabelas

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

Observe que se você tiver várias tabelas com o mesmo prefixo (ou sufixo), também pode usar curingas para selecioná-los com o -tparâmetro:

" Além disso, o parâmetro da tabela é interpretado como um padrão de acordo com as mesmas regras usadas pelos comandos \ d do psql "

um cavalo sem nome
fonte
25
a opção -T é da mesma maneira, mas usada para excluir tabelas. Pode ser útil se você precisar de todas as tabelas, exceto uma ou duas, etc.
Scott Marlowe,
4
A -Dopção parece ter desaparecido em PG 9.1 em diante
Epigene
5
A -Dopção foi removida na versão 8.4 . Você tem que usar --column-insertsagora.
mlovic
1
Tente pg_dump --host 127.0.0.1 --port 5432 --username "<username>" --column-inserts --verbose --file "/ tmp / <filename.sql>" --table "^ <regex> * "" <tablename> "
Tharindu Jayasuriya
23

Se essas tabelas específicas corresponderem a um determinado regex, você pode usar a opção regex em -t no pg_dump.

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

Por exemplo, para despejar tabelas que começaram com "teste", você pode usar

pg_dump -D -a -t zones_seq -t interway -t "^test*" -f /tmp/zones_seq.sql <DBNAME>
Jothikanth
fonte
3
se fosse um regex, não deveria ser ^test.*, em vez de ^test*?
msrd0
5
Não é um regex, ele usa os "padrões" do postgres, então deveria ser "test*": postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS
elliotcm
Não é trivial usar regex, gerando expressão regular inválida: erro de operando quantificador inválido . Mas a expressão regular está correta ... Somente regex muito simples são válidas
Peter Krauss