Crear una copia de seguridad de las bases de datos con bacula

Vamos a extender el post previo de copias de seguridad para incluir en nuestro sistema de bakcup las copias de la bbdd.

Para realizar la copia de seguridad de bases de datos, se utiliza un procedimiento casi similar al descrito en el primer post sobre bacula. La diferencia está en que antes de ejecutar la copia, llamamos a un script externo que se encarga de exportar todo el contenido de las bases de datos a un fichero sql. Posteriormente hacemos la copia de ese fichero con bacula. Para ampliar un poco más el sistema de copias de seguirdad se incluirá la lista de paquetes instalados en el sistema, lo que en caso de requerirse una restauración, esta será mucho mas rápida debido a que no tendremos que comprobar que todos los paquetes del necesarios para que funcione el sistema están instalados.

Se trabajará en la carpeta /usr/local/, dentro de ella existe un directorio llamado bin/ donde crearemos el script dump_ddbb.sh que se encargara de extraer todos los datos de la bbdd a un fichero SQL.
Procedimiento:
1.- Se crea el archivo /usr/local/bin/dump_ddbb.sh con el siguiente contenido:

#! /bin/sh
# Copia de seguridad de PostgreQL
BASE_PATH_PG=/usr/local/backupddbb/postgre
FILE=$(date +%Y%m%d%H%M%S).sql.gz
PG_FILE="${BASE_PATH_PG}/$FILE"

LOG=/var/log/bacula/bbdd

whoami > $LOG

PGPASSWORD=passwordUsuarioBacula pg_dumpall -U bacula| gzip > $PG_FILE
chmod 660 $PG_FILE
echo "Dump a: $PG_FILE" >> $LOG

for x in ${BASE_PATH_PG}/*;do
if [ "$x" != "$PG_FILE" ];then
echo "Borro el backup previo: $x" >> $LOG
rm $x
fi
done

#Copia de la lista de paquetes
dpkg --get-selections > /usr/local/backupddbb/dpkg/lista_de_paquetes

2.- Hay que cambiar los permisos del archivo a bacula:backup:

chown bacula:backup /usr/local/bin/dump_ddbb.sh
chmod 770 /usr/local/bin/dumpddbb.sh

3.-Como vemos en el script, vamos a almacenar el archivo sql en la carpeta /usr/local/backupddbb/postgre y /usr/local/backupddbb/dpkg. Se deben crear estos directorios primero.

mkdir -p /usr/local/backupddbb/postgre
chmod g+w /usr/local/backupddbb/postgre
mkdir /usr/local/backupddbb/dpkg
chmod g+w /usr/local/backupddbb/dpkg

4.- Probamos el script y comprobamos los resultados:

sudo -u bacula /usr/local/bin/dump_ddbb.sh

Una vez creado el script y las carpetas necesarias, se procede a configurar bacula.

5.- Se define el trabajo

Job {
Name = "Bases de datos"
Type = Backup
Level = Full
Client = Cliente-fd
FileSet = "bbdd"
Schedule = "DiariaCompleta"
RunBeforeJob = "/usr/local/bin/dump_ddbb.sh"
Storage = File
Messages = Standard
Pool = Databases
priority = 10
Write Bootstrap = "/var/lib/bacula/bbdd.bsr"
}

La clave está en: RunBeforeJob = "/usr/local/bin/dump_ddbb.sh"
6.- Se define el conjunto de archivos que se van a copiar. No añadimos compresión porque los datos ya están comprimidos.

FileSet{
Name = "bbdd"
Include {
Options {
signature = SHA1
}
File = "/usr/local/backupddbb"
}
}

7.- Se define el horario de las copias:

Schedule {
Name = "DiariaCompleta"
Run = Full daily at 23:10
}

8.-Se define el medio de almacenamiento.

Pool {
Name = Databases
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Maximum Volume Jobs = 7
Maximum Volumes = 8
Volume Retention = 1 month
Label Format = bbdd-Full
}

9.- Compruebo la configuración.

bacula-dir -t -c /etc/bacula/bacula-dir.conf

10.- Finalizado. La política que se ha definido es la de realizar cada día una copia completa de todo el contenido de las bases de datos. Realizar la copia de MySQL es trivial observando el fichero dump_ddbb.sh, de hecho, siempre suelo hacer copias de PostgreSQL y MySQL dentro del archivo dump_ddbb.sh, sin embargo para este tutorial no he incluido la configuración de MySQL para simplificarlo un poco. Se almacenan 7 trabajos por volumen hasta un máximo de 8 volúmenes, que son 56 trabajos, a uno por día son 56 días. Y al establecer un periodo de retención mínimo de 1 mes, todo debería funcionar sin problemas y con bastante holgura.

Un saludo.