Creación de un volcado de base de datos para tablas y entradas específicas Postgres

94

Tengo una base de datos con cientos de tablas, lo que tengo que hacer es exportar tablas específicas e insertar declaraciones para los datos en un archivo sql.

La única declaración que sé que puede lograr esto es

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

¿Debo ejecutar esta declaración para todas y cada una de las tablas o hay una manera de ejecutar una declaración similar para exportar todas las tablas seleccionadas en un gran sql grande? El pg_dump anterior no exporta el esquema de la tabla solo inserta, necesito ambos

Se agradecerá cualquier ayuda.

Elitmiar
fuente

Respuestas:

160

Desde el manual : " Se pueden seleccionar varias tablas escribiendo varios conmutadores -t "

Entonces necesitas enumerar todas tus tablas

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

Tenga en cuenta que si tiene varias tablas con el mismo prefijo (o sufijo), también puede usar comodines para seleccionarlas con el -tparámetro:

" Además, el parámetro de la tabla se interpreta como un patrón de acuerdo con las mismas reglas que utilizan los comandos \ d de psql "

un caballo sin nombre
fuente
20
el modificador -T es de la misma manera pero se usa para excluir tablas. Podría ser útil si necesita todas menos una o dos mesas, etc.
Scott Marlowe
4
La -Dopción parece haber desaparecido en PG 9.1 en adelante
Epigene
5
La -Dopción se eliminó en la versión 8.4 . Tienes que usar --column-insertsahora en su lugar.
mlovic
1
Pruebe pg_dump --host 127.0.0.1 --port 5432 --username "<username>" --column-inserts --verbose --file "/ tmp / <filename.sql>" --table "^ <regex> * "" <tablename> "
Tharindu Jayasuriya
22

Si esas tablas específicas coinciden con una expresión regular en particular, puede usar la opción de expresión regular en -t en pg_dump.

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

Por ejemplo, para volcar tablas que comenzaron con "prueba", puede usar

pg_dump -D -a -t zones_seq -t interway -t "^test*" -f /tmp/zones_seq.sql <DBNAME>
Jothikanth
fuente
3
si fuera una expresión regular, ¿no debería ser en ^test.*lugar de ^test*?
msrd0
5
No es una expresión regular, usa los "patrones" de postgres, por lo que realmente debería ser "test*": postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS
elliotcm
No es trivial usar expresiones regulares , generando una expresión regular no válida: error no válido del operando del cuantificador Pero la expresión regular es correcta ... Solo las expresiones regulares muy simples son válidas
Peter Krauss