lunes, 25 de febrero de 2008

Políticas de Backup

Me vi en la obligación de crear un par de políticas de backup para un servidor
mysql. La idea hera realizar todos los días un backup incremental y los días
domingos un backup completo.

No tengo muche experiencia en este RDBMS así que tube que buscar información
acerca del mismo, particularmente de como se hace un backup incremental
dado que solo sabía hacer el completo.

Entre toda la documentación que leí decidí hacer lo siguiente. Al backup
completo lo hago los domingos mediante mysqldump dejandolo en un directorio
compartido de otro servidor que sirve de intermediario antes de la descarga
al medio de almacenamiento permanente (cd o cinta, la descarga se realiza manualmente).

Para simplificar un poco las cosas cree un script en python que se encarga del
backup.

#!/usr/bin/python
import time
import os
pat = ''

os.chdir(pat)

curdate = curdate = time.strftime('%Y%m%d', time.gmtime())
archivo = curdate + '.sql'
archivocom = curdate + '.tar.bz'

cmd = "mysqldump -A -u USER --password=PASS -r %s" % archivo

os.popen(cmd)

cmdComprime = 'tar -jcvf ' + archivocom + ' ' + archivo
print cmdComprime
os.popen(cmdComprime)

cmdBorra = 'rm ' + archivo
os.popen(cmdBorra)

A dicho script lo almacene en el directorio /usr/local/bin y puse como dueño al root
y a los demas ni permiso de lectura dado que las password del administrador de mysql
esta escrita en dicho archivo.

Para el backup incremental utilice los los binary logs de mysql, para esto
habilite las opciones correspondientes en el archivo de configuración de mysql
(my.conf), el cual me quedo algo así:

log-bin = /var/log/mysql/mysql-bin.log
expire-logs-days = 7
max_binlog_size = 104857600

Configuré que la duración de los incrementales sea de 7 días, dado que realizo
un backup completo una vez a la semana, lo demas está por defecto.

Esto me dejá varios archivos en el directorio /var/log/mysql/, dichos archivos
son los backups incrementales. Por defecto cada archivo es por cada reinicio
y reinicio del servidor, cosa que no me convencio mucho, deseo que los archivos
del incremental sean por día (de lunes a sabado), para ello hay que cerrar una vez al día
el log y volverlo a abrir. Para poder cerrar el incremental y abrir uno nuevo hay que hacer
un FLUSH LOG, para esto utilizo la utilidad de línea de comandos mysqladmin, con
los siguientes parámetros.

mysqladmin -u USER --password=PASSW flush-logs

Para automatizar el proceso metí todo al crontab.

#Hace backup de Mysql completo a las 12:00 los domingos
30 2 * * 0 root /usr/local/bin/mysql-backup.py

#Hace el backup incremental de la base todos los dias excepto el domingo

30 2 * * 1-6 root mysqladmin -u USER --password=PASS flush-logs

Consideren que los archivos de log binarios utilizan un espacio conciderable en el disco (me encontre que llego a ocupar 45 GB en el servidor de producción cuando todas las bases del sevidor ocupaban aprox 10 GB).

Les dejo algunas referencias

http://dev.mysql.com/tech-resources/articles/point_in_time_recovery.html

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

http://dev.mysql.com/doc/refman/5.0/en/backup-policy.html