Backup de tablas específicas en PostgreSql

Ya vimos cómo se hacen los backups, como se los automatiza e incluso, cómo restaurar esos backups en PostgreSql.

Hace unos días tuve un requerimiento por el cual, si bien la base de datos en cuestión ya se backupea, me solicitaban hacer un backup con mayor periodicidad, pero sólo de un conjunto de tablas.

Bien, gracias a la flexibilidad de nuestro motor favorito, esto es muy sencillo.

Repasemos cómo hacíamos para hacer un dump completo de nuestro base de datos.

pg_dump -i -h localhost -p 5432 -U postgres -F c -b -v -f "/home/damian/backups/mibase.backup" mibase

Para exportar sólo un conjunto de tablas, tenemos que hacer un pequeño cambio.

pg_dump -i -h localhost -p 5432 -U postgres -t tabla -F p -b -v -f "/home/damian/backups/mitabla.sql" mibase

La diferencia entre ambos scripts radica en que agregamos el parámetro -t seguido del nombre de nuestra tabla (en este caso, con poca inspiración, usé tabla).

Lo que vamos a obtener es, solamente,  un backup de la tabla indicada, con su estructura y datos.

Si lo que necesitamos son un conjunto de tablas, tenemos dos formas de hacerlo.  La primera es usando el parámetro -t tantas veces como tablas vayamos a requerir.

pg_dump -i -h localhost -p 5432 -U postgres -t usuarios -t documentos -t logs -F p -b -v -f "/home/damian/backups/mistablas.sql" mibase

La segunda forma, es utilizar patrones (si es que se aplica a nuestro caso).

pg_dump -i -h localhost -p 5432 -U postgres -t productos_* -F p -b -v -f "/home/damian/backups/mistablas.sql" mibase

En ambos casos, se hará un backup de las tablas, vistas y/o secuencias que coincidan con lo indicado.

Llegado el caso, podríamos combinar ambos ejemplos y generar algo parecido a esto.

pg_dump -i -h localhost -p 5432 -U postgres -t usuarios_* -t documentos_* -t logs_* -F p -b -v -f "/home/damian/backups/mistablas.sql" mibase

De ésta forma obtendríamos todas las tablas (y/o vistas y/o secuencias) que comienzen con usuarios_, documentos_ y logs_.

Hay que tener en cuenta que al usar ésta técnica, pg_dump no intentará obtener aquellos objetos de los cuales puedan depender nuestras tablas. Es por eso que no se da garantía de que pueda restaurarse sin problemas éste backup.

Si prestan atención, comparando con el primer ejemplo que hace un backup total de la base de datos, hice un cambio al parámetro -F, pasándole como valor p en lugar de c. Lo que hace este cambio es devolver el backup en formato plano y no comprimido.

Otro escenario posible es que, en lugar de querer backupear ciertas tablas, quieren obtener todas, menos algunas. Ésto también es posible, sólo debemos hacer otro pequeño cambio.

El ejemplo sería el siguiente.

pg_dump -i -h localhost -p 5432 -U postgres -T productos_* -F p -b -v -f "/home/damian/backups/mibase.sql" mibase

El parámetro -T es el que se encarga de excluir una tabla. De ésta forma, el ejemplo anterior haría un backup completo, pero sin las tablas indicadas.

El tercer escenario, sería la combinación de ambos parámetros.

El comportamiento en este caso varía un poco. Vamos con un ejemplo.

pg_dump -i -h localhost -p 5432 -U postgres -T *productos -t documentos_* -t logs_* -F p -b -v -f "/home/damian/backups/mistablas.sql" mibase

Con ambos parámetros presentes, lo que se obtiene es un backup de los objetos indicados en -t pero que no coincidan con el patrón que toma -T.

Según el ejemplo, se hará backup de todas las tablas que comiencen con documentos_ y logs_, pero se excluirán todas aquellas que terminen con productos. Es decir que si existiera una tabla llamada logs_productos, ésta no será backupeada.

De más está decir que nunca hay que dejar de repasar la documentación oficial y hacer las pruebas necesarias antes de llevar algo a producción.

Tweet about this on TwitterShare on Google+Email this to someoneShare on FacebookShare on LinkedIn

26 pensamientos en “Backup de tablas específicas en PostgreSql

  1. Marcelo

    Muy bien explicado, aprovechando la ocación te pregunto como haces para restaurar un backup de una tabla específica que se encuentre en otra base de datos, muchas gracias!!

  2. Damián Autor

    @Marcelo

    No estoy seguro de entender la pregunta. Es decir, si haces un backup de esa tabla desde la base de datos 1, y luego haces un restore de esa tabla en la base de datos 2, ¿no te sirve para resolver ese tema?.
    Saludos.

  3. Marcelo

    Disculpa, me explico mejor, yo quiero hacer un backup de la tabla1 en la base de datos base1 y restaurar ese backup en la tabla2 por ejemplo de la base2, para hacer backup de tablas completas no tengo problemas, yo necesito hacer de una o más tablas (solo de datos, no de estructura) y copiar esos datos a otra tabla con la misma estructura y la cual pueda llegar a tener otros datos, muchas gracias por responder, saludos.

  4. Damián Autor

    @Marcelo

    Si al comando le agregas el parámetro -a se exportan sólo los datos, pero seguirías teniendo el “COPY tabla1…” en el dump.
    No estoy seguro si se puede hacer lo que planteas. Al menos por la documentación oficial no es posible.
    La solución parche/manual seria luego abrir el dump (si lo exportaste como plano) y modificar los nombres de las tablas (algo que se peude automatizar con un script facilmente).
    Saludos.

  5. Kilmeny

    Una pregunta
    Tengo una Base de Datos muy grande y solo quiero generar el backup de un schema en especifico ¿cómo lo hago, funciona igual que si fuera el ejemplo de las tablas? ¿hay algún modo de generar un script en ves de un backup?

  6. Kilmeny

    Gracias por responder, estuve probando, pero el problema es que para empezar, ni siquiera me reconoce el pg_dump. yo estoy usando CodeIgniter.

  7. Damián Autor

    @Kilmeny

    ¿Pero cómo lo estas usando?.
    ¿Podés enviar un ejemplo?.

  8. Arnaldo

    Hola tengo una duda que quisiera que me ayudaran a resolver resulta que tenemos varias bases de datos 5 para ser especificos y necesitamos restaurar el esquema de una de esas bd a otra bd existente en postgres es decir algo como restaurar el esquema de la bd alumnos a la bd personas claro ambas ya estan creadas mucho sabre agradecer su ayuda gracias de antemano.

  9. Marcelo Giuntoli

    Arnaldo para hacer un backup de la base usa el comando pg_dump -U postgres -W base_a_restaurar > backup_base.sql
    Donde postgres es el usuario, ahí tenés que poner tu usuario.
    Para restaurarla en cualquier base usas el siguiente comando:
    psql -U postgres – W base_que quiero_generar backup_base.sql
    2º) psql -U postgres – W personas < backup_base.sql

    Espero que te sirva, saludos.

  10. Marcelo Giuntoli

    Espero que no se enoje Damian porque me tome el atrevimiento de responder, saludos.

  11. Arnaldo

    creo que resolvi el problema con pgadmin 3 haciendo backup y restore al esquema que yo quiero y luego lo restauro en la bd que deseo que este el esquema respaldado me trae todo datos esquema etc.

  12. Damián Autor

    @Arnaldo

    Fijate que el PgAdmin te muestra los comandos que ejecuta cada vez que lleva adelante alguna acción.
    De esa forma vas a poder ver qué estás necesitando para, pro ejemplo, automatizar o armar un script para esas tareas.
    Saludos.

  13. Arnaldo

    si es correcto eso fue exactamente lo que hice y funciono a la perfeccion.!

    ahora eso se puede aplicar para automatizar ese tipo de respaldo y restore?

  14. Damián Autor

    @Arnaldo:

    Claro, fijate que te muestra el comando que se ejecuta.
    Saludos.

  15. Damián Autor

    @cesar

    Sinceramente no lo he probado, ya que en los casos en que lo he necesitado, restauraba el backup de las tablas específicas.
    Según la documentación de pg_restore, el parámetro hace justamente eso.

  16. Rhona

    buenas chic@s!!! será posible hacer respaldo de ciertos campos de una tabla… es que quiero respaldar de mi BD de nómina sólo algunos datos básicos de los empleados y no todos los del sistema de nómina, se podrá o me tengo que traer toda la tabla???

Los comentarios están cerrados.