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.
grax
@alba
De nadax.
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!!
@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.
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.
@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.
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?
@Kilmeny
El parámetro -n es para esquema.
Sobre lo del script, es un tema de parámetros también: -F p te lo generará como un archivo plano con sql.
Te recomiendo darte una vuelta por la documentación oficial: http://www.postgresql.org/docs/8.4/static/app-pgdump.html.
Saludos.
Gracias por responder, estuve probando, pero el problema es que para empezar, ni siquiera me reconoce el pg_dump. yo estoy usando CodeIgniter.
@Kilmeny
¿Pero cómo lo estas usando?.
¿Podés enviar un ejemplo?.
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.
@Arnaldo
¿Vos querés restaurar sólo los datos?.
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.
deseo restaurar todo
Espero que no se enoje Damian porque me tome el atrevimiento de responder, saludos.
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.
ah y blog esta muy muy bueno gracias por el aporte
@Marcelo
Al contrario. ;-)
@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.
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?
@Arnaldo:
Claro, fijate que te muestra el comando que se ejecuta.
Saludos.