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.

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 "


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>

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.