Respaldo automatico de bases de datos PostgreSQL

Un punto muy importante cuando se realiza una implantación es gestionar el respaldo de las bases de datos. Dependiendo del tipo de proyecto se puede optar por una estrategia u otra, pero como minimo lo normal será realizar una copia diaria de la base de datos. En este post veremos como realizar un script para Linux que realice la copia de la base de datos con pg_dum y que se ejecute diariamente usando cron. Tanto OpenERP como Openbravo funcionan sobre base de datos PostgresSQL, así que este script nos valdrá para los dos sistemas.

Lo primero vamos a ver como hacer un script que primero realice un vacuum de la base de datos para optimizar el rendimiento y luego realiza la copia de la base de datos poniendo como nombre la fecha actual y guardandola en el directorio que hayamos escogido.


# Hace Backup de produccion, poniendo como nombre la fecha del dian que se ejecuta
export FECHA=`date +%Y%m%d`
export NAME=${FECHA}.dmp
export DIR=/opt/backup
cd $DIR
> ${NAME}
# chmod 777 ${NAME}
export PGPASSWORD=password_db_user
vacuumdb -U db_user -h localhost -d database_name -f -z -v
pg_dump -U db_user -h localhost -F c -b -v -f ${NAME} database_name
return_code=$?
if [ $return_code -ne 0 ]
then
echo 'Error en el backup. Compruebe: usuario y permisos'
else
gzip -f *.dmp
echo 'Backup realizado correctamente. Archivo' ${DIR}/${NAME}.gz
fi
echo ${FECHA} ' Reiniciando la base de datos'
/etc/init.d/postgresql-8.4 stop
/etc/init.d/postgresql-8.4 start

IMPORTANTE Si la copia de la base de datos es de OpenERP, si reinicias PostgreSQL tendrás que reiniciar también el servidor de OpenERP.

/etc/init.d/openerp-web stop
/etc/init.d/openerp-server stop
/etc/init.d/postgresql-8.4 stop
/etc/init.d/postgresql-8.4 start
/etc/init.d/openerp-server start
/etc/init.d/openerp-web start

Dependiendo de como tengas la configuración de postgres puede que te pida el password del usuario que uses para acceder a la base de datos, para que el script se pueda utilizar sin que pisa esta contraseña tenemos que almacenar la contraseña del usuario en $PG_PASSWORD esto lo hacemos en la linea: export PGPASSWORD=password_db_user.

Lo primero creamos el fichero con el contenido que he puesto antes, lo hacemos ejecutable y hacemos que pertenezca al usuario con el que vamos a lanzar el script, en este caso con postgres, y creamos un fichero de log

mkdir /opt/backup
nano /opt/backup/do_backup.sh
nano /opt/backup/do_backup.log
chown postgres /opt/backup/do_backup.sh
chmod +x /opt/backup/do_backup.sh

Una vez que tengamos el script preparado para ejecutarlo hay que programarlo en cron para que se lance a diario, para programarlo con el cron abrimos una consola ejecutamos
crontab -e

con esto se abre el fichero de configuración de cron para añadirle la linea que ejecute nuestro script, en este caso se va a ejecutar todos los días a las 5:00 de la madrugada
# m h dom mon dow command
0 5 * * * /opt/backup/do_backup.sh >> /opt/backup/do_backup.log 2>&1

Con esto se van creando copias de la base de datos todos los días poniendo como nombre del fichero la fecha en que se realizó la copia, si queremos recuperar una copia de seguridad, lo primero que hay que hacer es crear la base de datos en la que vamos a restaurar los datos, si ya existe primero hay que eliminarla
psql -d postgres -U postgres
CREATE DATABASE database_name WITH ENCODING='UTF8' OWNER=database_user;
\q

y para restaurar los datos
pg_restore -i -U database_user -d database_name -h localhost -v -O /opt/backup/backup.dmp

En el próximo post podemos ver como realizar otro script para mover la copia de la base de datos en otro servidor.

25 comentarios sobre “Respaldo automatico de bases de datos PostgreSQL

  1. Pingback: Respaldo automatico de bases de datos PostgreSQL | Angel Moya « Thermomix Blog

  2. Gabriel Flores

    hola, me gusto tu exposicion decomo automatizar backups de una bd, yo quiero hacer algo similar, pero con una base de datos en informix, me cree el script que saca el backup, lo probe y funciona si lo ejecuto manualmente, pero cuando programo el cron no se ejecuta el backup por completo, de hecho solo se crea el directorio para el backup, y no hace el backup de la bd, que puedo hacer? alguna sugerencia?? me puedes ayudar
    saludos

  3. Angel Moya Autor del artículo

    Hola, la verdad que no he trabajado nunca con informix, pero puede que el problema sea con los permisos del usuario con el que estés ejecutando el cron. Las tareas cron pueden ejecutar con diferentes usuarios, si ejecutas “crontab -e” con el mismo usuario que realizas la copia de la base de datos y tienes permiso de escritura en el directorio debería dejarte.

  4. Gabriel Flores

    pues mira, no creo que sea problema de permisos, pues el cron lo cree bajo el usuario q saca backup de la bd, y como dije el script corre bien cuando ejecuto con el mismo usuario. Pero hay algo revisando el log q me arroja el cron me sale “command not found” en la linea que saca backup de la bd: “dbexport mibd -o /var/backup/”, al parecer cron no esta reconociendo el comando dbexport q es propio de informix. Se te ocurre q puedo hacer?gracias

  5. Angel Moya Autor del artículo

    Si no lo encuentra puede se problema del PATH en el momento de ejecutar via CRON, puedes probar a poner la ruta completa del ejecutable dbexport en el script, puedes comprobar metiendo en el script echo $PATH el valor que tienes cuando ejecutas el cron, y ver si es diferente al del usuario, puede no ser el mismo si cargas cosas en el PATH al inicio de sesión, y por eso no encontrarlo.

  6. merc

    Hola, muchas gracias por la información de hacer backups. Tengo un sistema en postgres y necesito hacer copias de seguridad cada cierto tiempo y me gustaría que fuera automáticamente. Mi problema es que tengo los servidores en windows server, ¿sabrías alguna forma de realizar los backups en windows?

    Gracias

  7. Angel Moya Autor del artículo

    Hola, hace tiempo que no toco servidores windows, pero tienen un programador de tareas, puedes mirar algo aqui, también tienes que traducir el .sh y hacer un .bat.

  8. pepe

    Hola antes que nada un saludo.
    Veras tengo un par de dudas sobre tu tutorial, ya que creo que yo estoy asiendo algo mal espero y me puedas ayudar.
    1° .-Para empezar en donde creo el scrip? ya que según e leído lo puedo hacer en cualquier editor de texto en este caso lo realice en gedit y cambie algunas cosas de tu código al mío por ejemplo contraseñas y nombre de la base de datos. ¿realice lo correcto?
    2°.- ¿Cómo lo guardo y en donde? porque lo que hice fue guardarlo con el nombre do_backup en la carpeta de opt/backup.
    La verdad trabajo muy poco en Linux pero en esta ocasión tengo que hacer el respaldo y la verdad tu tutorial fue el más completo que encontré.

    Gracias de antemano.

  9. Angel Moya Autor del artículo

    Hola, lo que has dicho es correcto, lo puedes crear con cualquier editor y guardarlo en cualquier sitio, sólo tienes que tener en cuenta el usuario y los permisos, si creas el directorio /opt/backup lo tendrás que crear como root, porque /opt es del root, y luego cambiar le el usuario con “sudo chown usuario /opt/backup” y el grupo con “sudo chgrp grupo /opt/backup”. Después de guardarlo hazlo ejecutable con “chmod +x /opt/backup/do_backup” y prueba a ejecutarlo

  10. suiren

    Muy bueno el post. Lo probé y funcionó. Muchas gracias.

  11. suiren

    Muy bueno el post. Hasta lo probé y funcionó. Muchas gracias.

  12. Camilo Mesar

    Buenas noches Angel:

    Acudo en tu apoyo pues tengo una situacion que realmente me tiene algo desconcertado, resulta que al iniciar el cliente web de OpenERP (Firefox, http://erp.everest-indsol.com:8069) el navegador entrega como error ‘No handler found’.Venia funcionando perfecto y ahora resulta que por algun motivo totalmente desconocido para mi presenta la interfaz de login y presenta éste error.

    Gracias por tu aporte al respecto.

  13. Angel Moya Autor del artículo

    Buenas, ese error suele pasar cuando se lanza el servidor de OpenERP con otra instancia lanzada en el mismo puerto, o cuando se lanza cuando el puerto está ocupado… puedes mirar log a ver que tiene.

  14. francisco

    excelente blog, corrio perfecto. justo lo que necesitaba. muchas gracias

  15. Yeilis

    Hola Angel, yo necesito hacer eso mismo que explicas en tu tutorial pero en window, me podrias explicar?

  16. Angel Moya Autor del artículo

    Buenas, lo siento pero no trabajo en windows, tendrás que hacer un script .bat y añadirlo a las tareas programadas de windows.

  17. yeilis

    Hola, ya yo logro realizar el backup todos los dias gracias al cron, pero lo que necesito es dejar las ultimas 7 fecheros backup en mi servidor, es decir eliminar y dejar solo 7, se que puedo hacer un ciclo en el propio scrip pero no me sale, alguien me puede ayudar por favor?????

  18. Juan

    Buenas tardes Angel no se en que parte estoy haciendo algo mal, copie el script tal cual, solo no se si el usuario que le debo poner sea con el que me logueo en ubuntu o uno root, si es el root debo poner la contraseña del root?, y la copia me la debe crear en la misma carpeta de /opt/backup??, estoy trabajando con openerp

  19. Angel Moya Autor del artículo

    La contraseña tendra que ser la del usuario de posrgres con el que hagas la copia

  20. Ana

    Hola Angel buen día, yo tengo un problema soy nueva en postgres pero a la hora de ejecutar el comando pg_dump me sale un error de permisos denegados, que permisos debe tener mi usuario para poder ejecutar este comando, gracias de antemano!

  21. gibran

    ¡Ayuda!
    quiero recuperar los datos de una base que se respaldo a las 8 am, y durante 20 minutos se realizaron transacciones, que no se respaldaron, pero con el archivo LOG de postgres recuperar los datos

  22. Josué Mejía

    Saludos, me encantó tu Expo! Yo estoy trabajando con postgres en debian y necesito hacer una función en el DBMS que haga el respaldo automático a las 18hrs cada día!alguna ayuda?

  23. Emilio Llinares

    Hola Angel, tu propuesta de respaldo y recuperación funciona genial. Sin embargo, tengo un problema que no logro resolver. Quiero duplicar una instalación en producción en un servidor de pruebas. Primero sustituyo todos los archivos de /opt/odoo del servidor de pruebas por el /opt/odoo del servidor en producción. La copia del servidor en producción la hago con un “tar -cpvzf mibackup.tar.gz ./*” y la restauro sin problemas en el servidor de pruebas.
    Por otra parte hago un pg_dump de la base de datos a duplicar y en el servidor de destino un pg_restore.
    Reinicio los servicios y funciona casi todo correctamente excepto la gestión de clientes que me da un error. La aplicación esta buscando un campo “zip_id” que no existe en la base de datos. Pero eso no pasa en el servidor en producción.
    ¿Sabes por donde puede ir el problema? Te pego el final del error de Odoo:

    File “/opt/odoo/openerp/addons/base/ir/ir_ui_view.py”, line 369, in raise_view_error
    raise AttributeError(message)
    AttributeError: El campo `zip_id` no existe

    Error de contexto:
    Vista `res.partner.form`
    [view_id: 126, xml_id: base.view_partner_form, model: res.partner, parent_id: n/a]

    No le veo el sentido. Si tengo la misma aplicación y base de datos en ambos servidores no debería tener problemas, ¿no?

    Un saludo Angel

  24. Emilio Llinares

    Hola de nuevo Angel. Ya lo tengo resuelto. En vez de copiar /opt/odoo he creado en el servido de pruebas una base de datos y he instalado los módulos que tengo instalados en la base de datos del servidor de producción. Luego he borrado la base de datos de pruebas y he ejecutado el pg_restore. Ya no da error.

    Un saludo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *