Backup en caliente de mysql con bacula

Bueno gente, un nuevo trabajo para nuestro bacula, y es precisamente backepear el mysql “en caliente” digo en caliente porque durante lo que dure el backup no se podrán escribir archivos, pero si leerlos.

mkdir /home/mysql/
—-/etc/sudores—-
%bacula ALL=NOPASSWD:/sbin/mysqlprebackup
—EOF—
—-/opt/mysqlbackup.sql—-

flush tables with read lock;
system /sbin/mysqlbackup.sh
unlock tables;

—EOF—
—-/sbin/mysqlprebackup—-

#!/bin/bash
mysql -u root --password=XXXXXX < /opt/mysqlbackup.sql

---EOF---
----/sbin/mysqlbackup.sh----

#!/bin/bash
rm -rf /home/mysql/*
cp -rfp /var/lib/mysql/* /home/mysql/

---EOF---
Ahora todo lo que nos queda hacer es nuestro job para backupear /home/mysql/

Job {
Name = "Mysql"
Level = Full
FileSet = "Mysql"
JobDefs = "DefaultJob"
Schedule = "Daily"
Write Bootstrap = "/var/lib/bacula/Mysql.bsr"
# backup en caliente
RunBeforeJob = "sudo -u root /sbin/mysqlprebackup"
}

# Archivos que serán backupeados
FileSet {
Name = "Mysql"
Include {
Options {
signature = MD5
}
File = /home/mysql/
}
}

Reiniciamos el bacula
/etc/init.d/bacula-director restart

probamos
root@cari1:/opt# /sbin/bconsole
Connecting to Director tuhost.com:9101
1000 OK: tuhost.com-dir Version: 1.38.11 (28 June 2006)
Enter a period to cancel a command.
*run Mysql
Using default Catalog name=MyCatalog DB=bacula
Run Backup job
JobName: Mysql
FileSet: Mysql
Level: Full
Client: tuhost.com-fd
Storage: File
Pool: Default
When: 2009-12-02 12:45:11
Priority: 10
OK to run? (yes/mod/no): yes
Job started. JobId=21

Si no les funciona comente.
Saludos.

Tags: , , , ,

4 Responses to “Backup en caliente de mysql con bacula”

  1. Francisco Garcia says:

    Personalmente creo que quedaría más bonito así:

    —/sbin/mysqlbackup.sh—

    #!/bin/bash
    ##ALGUNAS VARIABLES##
    MYSQL_HOST=tu servidor de Mysql
    MYSQL_USER=Un usuario con permiso de acceso a las bases de datos a respaldar
    MYSQL_PASSWD=La dichosa contraseña 😀
    MYSQL_BACKUP_DIR=Directorio en el que se guardarán las copias de seguridad
    ##FIN DE LAS VARIABLES##

    for i in `mysql -h $MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWD -Bse “show databases”`; do
    mysql -h $MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWD –database=$i -Bse “flush tables with read lock”;
    nice -n 20 mysqldump –single-transaction –quick –skip-extended-insert -h $MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWD $i > $MYSQL_BACKUP_DIR/$i.sql
    mysql -h $MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWD –database=$i -Bse “unlock tables”;
    done
    —EOF—

    Luego en bacula hay que poner en la definición del trabajo:

    RunBeforeJob=/sbin/mysqlbackup.sh

    Así no tienes que tocar sudo y los ficheros resultantes son más portables entre servidores de MySQL, también creo haber leido en algún sitio que copiar los ficheros de las bases de datos de MySQL a pelo no te garantiza la integridad referencial en tablas InnoDB.

    Por cierto… no hay que olvidar: chmod +x /sbin/mysqlbackup.sh

    Lo he escrito todo de cabeza así que no garantizo su funcionamiento XD

  2. Matias says:

    ¿No probaste hacer los backups en caliente utilizando los binary logs de MySQL?
    Nosotros los hacemos así y siempre con buenos resultados 🙂

  3. Alkareth says:

    Hola!

    Tengo un par de dudas, resulta que quiero hacer una copia de seguridad del MySQL de un server y guardarlo en otro entonces, ¿Dónde he de poner los scripts? En el server del cual quiero hacer la copia o en el que la va a almacenar y, por otro lado… ¿Cómo hago para hacer un restore de los archivos que se generan en /home/mysql?

    Saludos