miércoles, 7 de septiembre de 2011

Realizar un Backup fácil de PostgreSQL con pg_dump


Hace unas semana me enviaron a realizar un Script que automatice el proceso de realización de Backup de la base de Datos PostgreSQL de nuestro servidor de producción el cual pueda a su vez pueda irse poco a poco perfeccionado hasta que pueda ser utilizado en los servidores.
Así que me pareció interesante poder compartirlo con ustedes ya que tiene 2 semanas funcionado y anda bien, bueno aquí les va.



Revisando el requerimiento

el Backup se realiza diario a las 2:00 am y utilizara al usuario de la Base de datos neotrons para realizar el Backup de la base de datos pruebas y luego de realizar el Backup debe de enviar un mensaje al administrador que el backup fue realizado satisfactoriamente en tal fecha.
Al parecer no suena muy complejo y como a todos a primera vista se nos ocurre hacerlo con pg_dump, este comando en forma general extrae una base de datos PostgreSQL a un fichero de script.
Todo marchaba bien en mi escenario de pruebas, hasta que uno de mis primeros inconvenientes fue que al realizar el Script de pruebasel usuario neotrons no tenía una contraseña definida por lo cual el backup se realizaba satisfactoriamente sin pedir la contraseña, pero al momento que asígnanos una contraseña al usuario nos pedía que ingresemos la contraseña de forma manual y al hacer un pg_dump –help no existia una opcion para asignarle la contraseña tal y como el “-U nombre” para asignar el usuario, por lo tanto las ideas venían a mi y como siempre esto se soluciona sitiando la variable, pero que variable es la que asigana el password en PostgreSQL, asi que googleando encontré que la variable es “PGPASSWORD” entonces en que consitira el seteo de la variable pues nada mas que asignar a la variable PGPASSWORD en valor que queramos y eso lo hacemos de la siguiente forma:

export PGPASSWORD='123456' #Le asignamos el password
unset PGPASSWORD #Liberamos la variable

Otra de las cosas interesantes de este script es que debe enviar un mensaje al administrador, esto si es algo mas tocado porque lo hago casi siempre en los script que realizo, para esto uso sendmail lo cual hace mas facil la linea de codigo.

echo "El backup diario de la Base de Datos de $NOMBRE se ha completado satisfactoriamente el $FIN" | mail -s "Backup pg_dump diario " admin@peruoverflow.com

sobre este codigo el nuevo reto es que en el mensaje Envié el log es decir los datos q se generen al realizar el comando pg_dump, eso ya es para la próxima entrada del blog así que no insistas jaja no lo he realizado aun =),
Aquí les va el Script completo para los que les interese

#!/bin/bash
#
# Backup diario de la Base de Datos PostgreSQL
# www.peruoverflow.blogspot.com – By Neotros
#########################################

#Declaración de variables
HOST='ws28'
NOMBRE=`hostname`
DIA=`date +%A`
HORA=`date +%H`
FIN=`date "+%d/%m/%Y a las %l:%M:%S"`
#Especificamos la ruta del pg_dump puede variar según la distribución
BACKUP='/usr/bin/pg_dump'
#realizar el Backup a las 2 am
if [ "$HORA" = "02" ];
then
#seteo de las variables user y password
export PGUSER='neotrons'
export PGPASSWORD='123456'
#realizacion de Backup con pg_dump mas detalle pg_dump --help
$BACKUP -h localhost -p 5432 -F plain -v -f "/backup_$HOST/backup_sql_diario/curaseo_$DIA.sql" curaseo >> pruebasalida.txt
#Envio de mensaje de confirmacion
echo "El backup diario de la Base de Datos de $NOMBRE se ha completado satisfactoriamente el $FIN" | mail -s "Backup pg_dump diario " admin@peruoverflow.com
#Liberar las variables seteadas
unset PGUSER
unset PGPASSWORD
fi
#FIN DE BACKUP

Espero que les sirva y que si encuentran algún modo de optimizarlos lo compartan asi podamos hacer un scrip robusto para backup, ya pronto les daré novedades sobre como capturar el log del comando.
Fuentes:

1 comentario:

  1. suena excelente lo probare, una pregunta manejando una base de datos de algunos 2 o 3 gb suena algo sencillo, pero cuando hablamos de una base de datos de mas de 50 gb es donde vendría el problema, mas cuando el servidor esta en producción, ¿Cuantos gb de información manejaste con tu script?

    ResponderEliminar