Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas

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

viernes, 22 de febrero de 2008

JOINS

Hace unos días un cliente me pidio que cree un reporte para su sistema, del cual fuí uno de los creeadores. La cuestión es que me puse a hacerlo a la siesta y estaba super cansado, obviamente no paraba de equivocarme y casí no podía pensar.
Necesitaba hacer una consulta haciendo una cruza entre varias tablas y no recordaba bien los tipos de cruza más complicados, esos que estan y casí nunca usamos dado solucionamos el problema en el código por no querer pensar un poco más en SQL, entonces me puse a googlear un poco para compenzar mi mala memoría, me encontré con un tutoríal de JOINS muy bueno, el cual muestra los diferentes tipos de joins con gráficas mediante diagramas de Venn con el comportamiento de la operación.
Recomendada la lectura del Articulo.