martes, 1 de diciembre de 2009

Respaldo programado básico para POSTGRESQL

En esta ocasión, documentaré un procedimiento muy sencillo para poder realizar respaldos de determinadas bases de datos en PostgreSQL en GNU/Linux Debian Lenny.

Se basa en un "script" muy sencillo, no obstante, refleja el concepto principal de ejecutar el respaldo de manera programada a través de "cron".

El "script" lo he almacenado en el directorio "/usr/local/sbin/respaldo-postgresql.sh"

A continuación muestro el contenido de script:

#!/bin/bash
su -l postgres -c 'pg_dump moodle_cgv > /var/backups/postgresql-backups/moodle_cgv_`date +%Y%m%d-%H%M%S`.sql'

su -l postgres -c 'pg_dump moodle_pregrado > /var/backups/postgresql-backups/moodle_pregrado_`date +%Y%m%d-%H%M%S`.sql'

su -l postgres -c 'pg_dump moodle_postgrado > /var/backups/postgresql-backups/moodle_postgrado_`date +%Y%m%d-%H%M%S`.sql'

Luego, editamos las tareas a través de:

#crontab -e

0 3 * * * postgres /usr/local/sbin/respaldo-postgresql.sh

Como se puede apreciar, el script de respaldo extrae tres bases de datos y crea archivos ".sql" en los cuales se concatena la fecha y hora del respaldo.

A través del "cron", el respaldo se realizaría todos los días del año a las 03:00 AM.

He podido encontrar en la "wikisphera", scripts mucho más elaborados que copian los respaldos en servidores externos. Así debe ser la implementación final del sistema de respaldo, sin embargo, dado que hay 1000 formas de hacerlo, a continuación muestro una de las que conseguí:

#! /bin/sh
#############################################
#Nombre: backup_diario.sh Fecha: 18/04/2007
# Script para realizar Backup de las Bases de datos existentes
# Ademas se controla la cantidad de copias que se desea guardar
# Luego de esto envia por SSH a otro servidor el respaldo,
# evitando asi cualquier tipo de riesgo por daño en el soporte
# físico (HDD)
#############################################
BACKUP_DIR=/home/postgres/backup
BACKUP_DIR_REMOTO=192.168.7.1:/home/backup/
BACKUP_NUM=7
# Realizar Backup de las DB'S
databases=`su -l postgres -c 'psql -q -t -c "select datname from pg_database;" template1'`
for d in $databases; do
if [ ! -d $BACKUP_DIR/$d ];
then echo -n "Creando directorio de respaldo $BACKUP_DIR/$d... "
su -l postgres -c "mkdir $BACKUP_DIR/$d" ] || continue
echo "done."
fi
# Establecer cantidad maxima del mismo backup $BACKUP_NUM
archive=$BACKUP_DIR/$d/$d.gz
if [ -f $archive.$BACKUP_NUM ]; then
rm -f $archive.$BACKUP_NUM;
fi
n=$(( $BACKUP_NUM - 1 ))
while [ $n -gt 0 ]; do
if [ -f $archive.$n ]; then
mv $archive.$n $archive.$(( $n + 1 ))
fi
n=$(( $n - 1 ))
done
if [ -f $archive ]; then
mv $archive $archive.1;
fi
echo -n "Respaldando la base $d... "
su -l postgres -c "(pg_dump $d |gzip -9) > $archive"
echo "Transfiriendo archivo $archive"
scp $archive root@$BACKUP_DIR_REMOTO
echo "Tarea Finalizada."
done



Este "script" es mucho más robusto sin embargo presume la copia de archivos sin solicitud de claves vía SSH en el servidor remoto.

Espero sea de utilidad.

Éxitos!

José Gregorio.