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

sábado, 1 de noviembre de 2008

Guía Rápida de MySQL


Cuantas veces nos pasas que debemos realizar una tarea administrativa en algún producto de software y no recordamos como hacerlo, seguramente les pasa todo el tiempo.

Este sitio nos da una ayudita para que eso no suceda en MySQL, nos provee de una guía rápida de mysql en la cual se abordan mucha de las cuestiones fundamentales del famoso RDBMS.

http://www.xtec.net/~acastan/textos/Administracion%20de%20MySQL.html

lunes, 28 de abril de 2008

Recuperando un Backup con poco y nada

Una de mis tareas en mi trabajo es mantener la base de datos de una de las aplicaciones de la organización, el RDBMS es MySQL en su versión 5.0 comunity.

Accidentalemte se borro una de las tablas en dicha base y obviamente me pidieron que recupere la tabla del backup, yo muy feliz fuí a buscar los backup's para recuperar la tabla y me encuentro con que el último backup completo hera del 25 de feberero y solo con ciertos incrementales (binlogs de mysql), la mayoría del las copias fallaron debido a que la unidad donde relizaba los respaldos se ocupaba para otras cuestiones y aveces no contaba con el espacio necesario.

Al darme cuenta de lo sucedido empezé a sudar como testigo falso, dado que nunca me puse a controlar si los backups se realizaban adecuadamente, mea culpa. Empezé a pensar como podía recuperar la información e inmediatamente fuí a ver si los binlog seguían en el servidor de producción, y sí efectivamente estaban todos y completos.

Fue ahí cuando decidí recuperar la base completa al 25 de febrero y aplicar los binlogs hasta el día de la catastrofe, 18 de abril.
Descomprimí el backup completo de la base, obtenido mediante un msyqldump, y el mismo pesaba 14 GB, esto es debido a que en el mismo estaban todas las bases de datos de esa instancia y yo solo quería una de ellas a la que llamaré XXX.

Probe tratar de editar el archivo con vi, nano, kedit, gedit pero ninguno podía abrirlo. Sin saber que hacer para extraer solo la base XXX del backup se me ocurrió utilizar la consola de linux. Lo primero que hice fue ver las lineas donde empezaban las bases, como?, fácil, en el dump de mysql la primera instrucción es CREATE DATABASE, por ello realizé un grep con dicha expresión sobre el archivo e indique me muestre los números de líneas.

grep -n "CREATE DATABASE" bkp-25-02-2008.sql

El mismo me arrojo algo así

10 CREATE DATABASE ....
1400 CREATE DATABASE ....
23456 CREATE DATABASE XXX
45234 CREATE DATABASE ...
....

Una vez que tenía la línea donde empezaba y terminaba el dumpeo de la base XXX, realizé un head hasta la línea 45234 para obtener la primera parte y luego apliqué un tail desde el final a la línea 21778 (45234 - 23456). El comando quedo algo así

#head -n 45234 25022008.sql |tail -n 21778 > recorte.sql

Una vez que termino el archivo resultante quedo de 2.7 GB. En una base de datos limpia cargue el dumpeo recortado.

mysql -u root -p < recorte.sql

Al finalizar tenía la base lista al 25 de febrero y solo restaba aplicar los binlogs de cada día. Como heran varios decidí hacer un pequeño script en python para que los procese de a uno. Básicamente hera un bucle for que iba desde el número de binlog incial (1828) al final (1976), este transforma cada bin log en un script sql (mysqlbinlog) y lo deja en un archivo temporal el cual es importado a la base.

#!/usr/bin/python
import os for i in range(1828,1976):
print i
file = 'mysql-bin.00%s' % str(i)
os.popen('rm tmp.sql')
os.popen('mysqlbinlog --database=XXX %s > tmp.sql' % file)

os.popen('mysql -u root --password=lapass <>

La primera vez que lo probe arrojo unos errores, lo primero que pense es que continuaba la importación después de el error pero había sido que no, la importación se corta directamente en el punto de error, en consecuencia faltaba muchisima información.

Al final de todo y después de varias pruebas tuve la suerte de poder recuperar la información.

Esta fue una linda experiencia para contar pero no para vivirla, todo esto se hubiese solucionado siendo un poco cuidadoso en chequear los backups generados automáticamente.

viernes, 18 de abril de 2008

MySQL - Ahora se cierra el circulo




Acabo de enterarme que Sun decidió empezar a cerrar más aún el código de MySQL, cosa que no me sorprende para nada dado que siempre avise a todo el mundo de que esto pasaría y pocos me escucharon.

Según tengo entendido una de las carácteristicas más interesantes que no estarán disponibles en la versión de la comunidad es la de backup-online (característica muy necesitada para cualquier entorno de producción del tipo 24/7).

Muy interesante a todo esto es la reflexión de Facundo Arena, muy sabía por cierto.

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

jueves, 17 de enero de 2008

MySQL es de SUN


Hace unos día se acaba de vender MySQL a SUN, un gran movimiento en el sector corporativo informático dado que SUN dispone de toda una familía de soluciones informáticas para empresas (desde hard a soft) pero no contaba con un RDBMS. Hace poco empezo una campaña para promover el uso de PostgreSQL como RDBMS certificado de la empresa, lamentablemente no se que pasará de ahora en más.



La cosa es que SUN continua agrandando su carterá de servicios solidos y respetables pensado siempre en el open source como gran apuesta.

Espero ver grandes cosas en el futuro por esta jugada.

Mas info en el blog de MySQL

Entre otras novedades Oracle compro BEA por $7.85 billiones, pero esto es mucho software propietario para mi gusto.