systemadmin.es > Backup > Backups en caliente de MySQL usando snapshots LVM y bacula

Backups en caliente de MySQL usando snapshots LVM y bacula

Anteriormente ya se habló de los backups en caliente de MySQL usando snapshots LVM. En este caso vamos a ver cómo configurar el script para usar-lo conjuntamente con bacula.

Tal como se comentó anteriormente, mediante mylvmbackup se pueden hacer backups en caliente de MySQL. Después se podría configurar el bacula para recoger el backup que quedaría en: /var/tmp/mylvmbackup/backup/ y el snapshot se quitaría.

Con esta configuración tenemos el problema que el bacula comprime el archivo que ya tenemos comprimido, y aúnque no se comprimiera necesitariamos espacio para tener el archivo que el bacula tendría que llevarse.

Este mismo script permite hacer solamente el snapshot. Su configuración es la siguiente:

[mysql]
user=root
password=password
host=localhost
port=3306
socket=
mycnf=/etc/my.cnf

[lvm]
vgname=datos
lvname=mysql
backuplv=snap.backup
lvsize=25G

[fs]
xfs=0
mountdir=/var/tmp/mylvmbackup/mnt/
backupdir=/var/tmp/mylvmbackup/backup/
relpath=

[tools]
lvcreate=/usr/sbin/lvcreate
lvremove=/usr/sbin/lvremove
lvs=/usr/sbin/lvs
mount=/bin/mount
tar=/bin/tar
rsync=/usr/bin/rsync
rsnap=/usr/bin/rsnap
umount=/bin/umount

[misc]
backuptype=none
prefix=backup
suffix=_mysql
tararg=cvf
tarsuffixarg=
tarfilesuffix=.tar.gz
compressarg=--stdout --verbose --best
rsyncarg=-avWP
rsnaparg=7
datefmt=%Y%m%d_%H%M%S
innodb_recover=0
pidfile=/var/tmp/mylvmbackup_recoverserver.pid
skip_flush_tables=0
extra_flush_tables=0
skip_mycnf=0
hooksdir=/usr/share/mylvmbackup
skip_hooks=0
keep_snapshot=1
quiet=0


[logging]
log_method=console
syslog_socktype=native
syslog_facility=
syslog_remotehost=

De esta configuración los parámetros importantes són:

backuptype=none
keep_snapshot=1
lvsize=25G

Vemos que es cada uno:

  • backuptype: Se indica que no realize ningun tipo de backup, sólo realia el snapshot.
  • keep_snapshot: El snapshot por defecto se elimina, con keep_snapshot indicamos que se mantenga
  • lvsize: Indica el tamaño reservado para el snapshot, si queremos mantenerlo duranto cierto tiempo tiene que ser suficiente para mantener los cambios que ocurran en el sistema de ficheros durante ese tiempo. Evidentemente depende mucho del tipo de acceso que tenga el MySQL.

Así, el snapshot queda en el sistema, por lo que el bacula sólo hace falta que haga el mount, realize la cópia del contenido y eliminie el backup.

También se le puede dar una vuelta de tuerca más manteniendo los snapshots en la máquina ciertas horas para recuperar los datos rápidamente en caso de borrado accidental. Ésto se puede hacer mediante un script tant sencillo como éste:

#!/bin/bash

CURRENTSNAP=$(date +"%H")

touch /tmp/snap.in.progress

unlink /dev/bacula.snap
lvremove -f /dev/datos/snap.${CURRENTSNAP}
mylvmbackup
lvrename /dev/datos/snap.backup /dev/datos/snap.${CURRENTSNAP}
ln -s /dev/datos/snap.${CURRENTSNAP} /dev/bacula.snap

rm -f /tmp/snap.in.progress

Éste script crea un fichero en /tmp llamado snap.in.progress para indicar que esta realizando operaciones. Lo que hace es crear snapshots mediante mylvmbackup y renombrarlos con la hora que han sido lanzados, borrando si existe otro con el mismo nombre.

Así, configurando en el cron cada 4 horas este script se mantienen en el sistema 6 snapshots del MySQL enlazando el último con un soft-link llamado /dev/bacula.snap

Evidentemente el tiempo de cópia tiene que ser menor que el tiempo que se mantendrá vivo el snapshot, en este caso 24 horas.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>