Backup DB2 con bpipe y Bacula Community

El bpipe es un plugin genérico de Bacula Community que permite configurar un script de copia de seguridad de prácticamente cualquier aplicación enviando los datos directamente para el Bacula a través de un Named Pipe (FIFO), sin la necesidad de guardar ningún dato en la máquina del cliente.

Tenemos un curso en el Udemy sólo sobre el bpipe, con varios ejemplos, como la copia de seguridad de bases de datos MySQL, PostgreSQL, Firebird, LDAP; Máquinas Virtuales del Xen, KVM, Proxmox; Cajas de correo de Zimbra, dentro de otros.

El bpipe también está presente en el Bacula Enterprise, pero el mismo ya contiene los plugins para más de 20 aplicaciones específicas, con recursos más automatizados y técnicas más avanzadas en la reducción en el tamaño de estas copias de seguridad.

Todos los procedimientos de copia de seguridad y restauración de bpipe se deben probar antes de que se implementen en entornos de producción. Cualquier feedback es apreciado.

Configuración

Activación del Backup Incremental de DB2

Para especificar si la copia de seguridad incremental está habilitada para una base de datos, utilice el parámetro de configuración TRACKMOD. Este parámetro especifica si el administrador de la base de datos rastreará las modificaciones de la base de datos para que la utilidad de copia de seguridad pueda detectar qué subconjuntos de la base de datos deben examinarse mediante una copia de seguridad incremental y posiblemente incluidos en la imagen de copia de seguridad.

El parámetro de configuración TRACKMOD puede tener uno de los dos valores siguientes:

  • NO – No se permite la copia de seguridad incremental. Las actualizaciones de la página de base de datos no se rastrean o se registran de ninguna manera. Este es el valor predeterminado.
  • SIM – se permite la copia de seguridad incremental. Cuando el rastreo de actualización está activado, el cambio se vuelve efectivo cuando se realiza la primera conexión correcta a la base de datos. Tenga en cuenta que antes de que se pueda realizar una copia de seguridad incremental en un espacio de tabla específico, es necesario realizar una copia de seguridad completa de este espacio de tabla (más detalles sobre esto se sigue con el ejemplo siguiente).
    En el ejemplo siguiente se muestra cómo activaría la copia de seguridad incremental:
DB2 UPDATE DATABASE CONFIGURATION FOR DBNAME USING TRACKMOD YES

Puede utilizar algo como la siguiente secuencia de comandos para activar TRACKMOD igual a YES para todas las bases de datos DB2:

db2user=db2inst1
for dbname in $(su - $db2user -c "db2 list database directory" | grep Indirect -B 5 |grep "Database alias"| awk {'print $4'} |sort -u | uniq); do
su - $db2user -c "db2 UPDATE DATABASE CONFIGURATION FOR $dbname USING TRACKMOD YES"
done

Si aún no está configurado, también debe habilitar el modo de registro de archivado para cada base de datos. Por ejemplo.

su - db2inst1 -c "db2 update db configuration for DBNAME using logarchmeth1 disk:/var/db2"

Ahora es posible ejecutar diferencial (IBM llama incremental) e incremental (backup delta).

Configuración bpipe

La siguiente secuencia de comandos de shell se utiliza para informar a Bacula sobre qué configuraciones de bpipe utilizar para la tarea de copia de seguridad durante la ejecución.

Recibe el nivel de Job de copia de seguridad, obtiene todas las bases de datos existentes de DB2, crea canalizaciones con nombre para cada base e imprime las configuraciones del archivo de bippo del bpipe a Bacala Job.

#!/bin/bash
#
# /opt/bacula/etc/db2_bacula.txt
#
# Script to generate Bacula FileSet bpipe syntax configuration in order to backup
# all db2 databases from an instance 
#
# Autorship: Heitor Faria (Copyleft: all rights reversed).
# Advisor: Julio Neves Shell Script Teacher - julio.neves@gmail.com
# Tested by: Heitor Faria
# 
# It must be called at the FileSet INCLUDE Sub-resource, used by the job that 
# backups DB2 machine and contains a Bacula Client, like this (e.g.):
#
# Plugin = "\\|/opt/bacula/etc/db2_bacula.txt %l"
#
# The following example shows how you would enable DB2 incremental backup and archive log, required by this script:
# 
# su - db2inst1 -c "db2 UPDATE DATABASE CONFIGURATION FOR DBNAME USING TRACKMOD YES"
# su - db2inst1 -c "db2 update db configuration for DBNAME using logarchmeth1 disk:/var/db2"
#

level=$1
db2user=db2inst1
pipedir=/mnt/pipe

# test if pipedir exists or create it
[[ -d "$pipedir" ]] || mkdir -p $pipedir

# verify backup level and set db2 backup command options
if [ $level == Differential ] 
then
options="INCREMENTAL"
fi

if [ $level == Incremental ] 
then
options="INCREMENTAL DELTA"
fi

# creates named pipes, calls db2 backup and configures Bacula bpipe
for dbname in $(su - $db2user -c "db2 list database directory" | grep Indirect -B 5 |grep "Database alias"| awk {'print $4'} |sort -u)
do
[ -p $pipedir/$dbname ] || {
mkfifo $pipedir/$dbname
chown $db2user $pipedir/$dbname
}
su - $db2user -c "db2 -r /tmp/db2bkp.log +o BACKUP DATABASE $dbname ONLINE $options TO $pipedir/$dbname WITHOUT PROMPTING" & 2>&- 
echo "bpipe:$pipedir/$dbname.db2.$level:cat $pipedir/$dbname && rm -f $pipedir/$dbname:dd of=/tmp/$dbname.db2.$level"
done

Después de guardar una secuencia de comandos en una carpeta (por ejemplo: /opt/bacula/etc/db2_bacula.txt), crear un nuevo Bacula FileSet con la línea siguiente Include:

Plugin = "\\|/etc/bacula/scripts/db2bpipe.sh %l"

Es importante probar todos los comandos de secuencia de comandos en el shell. Ejecute trabajos de pruebas de copia de seguridad y restauración e inicie bacula-fd en modo de depuración si aparece algún error.

Si desea restaurar la copia de seguridad del banco directamente a db2, reemplace el comando de restauración de bpipe por el siguiente:

dd of=/tmp/$dbname.db2.$level && su - $db2user -c 'db2 restore db $dbname from /tmp/$dbname.db2.$level replace existing' && rm -f /tmp/$dbname.db2.$level

Referencias

Using DB2 incremental backup – https://www.ibm.com/developerworks/data/library/techarticle/dm-0910db2incrementalbackup/index.html

Disponível em: pt-brPortuguês (Portugués, Brasil)enEnglish (Inglés)esEspañol

Deja una respuesta