jueves, 20 de octubre de 2011

Backups en MySQL

Como base de datos MySQL es un motor interesante para realizar pequeños proyectos. Aunque carece de importantes propiedades de otros motores del mercado, tanto libres como comerciales, es capaz de presentar una buena performance y facilidad de uso.
Realizar backups es una tarea que pasa desapercibida hasta que se necesita arreglar algun desastre. Hoy en dia las tablas InnoDB tienen la posibilidad de hacer backup desde sus "binary-logs" como si de archive logs de Oracle se tratase pero las MyISAM no poseen esta caracteristica. Ademas a veces simplemente deseamos hacer un backup full diario y nada mas.
Despues de un tiempo de tener unas bases de datos en producción se me ocurrio implementar una estrategia de backups un poco mas elaborada para mis tablas, que habian crecido hasta 200Mb mas o menos. Nada impresionante pero de perderlas me causarian grandes dolores de cabeza.

 La estrategia no era para nada compleja, solamente un backup diario y rotarlas a diario por 3 dias. Para esto me valgo de 2 herramientas que provee el paquete de MySQL, "mysqlhotcopy" y "mysqldump".

No hace falta aclarar que para que esto funcione desatendidamente desde la crontab es necesario configurar el cliente de mysql para que se pueda conectar sin clave (mejor dicho con clave pero usando el archivo .my.cnf en el home del usuario administrador).


Breve explicacion:
El script utiliza un archivo de configuracion, que no es otra cosa que un txt con los nombres de las bases que se deben respaldar, que es leido por el bucle principal que realiza el dump (export para los DBA) y los deja en el DAILY.0.

Enlaces:
http://dev.mysql.com/doc/refman/5.1/en/option-files.html
http://dev.mysql.com/doc/refman/5.0/en/innodb-backup.html
http://dev.mysql.com/doc/refman/5.5/en/mysqlhotcopy.html
http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html

miércoles, 12 de octubre de 2011

Self extracting shelll script

Self extracting shell script (o como hacer un shell auto extraible)

Si se desea distribuir un paquete de software a veces es deseable empaquetarlo todo en un solo archivo y moverlo de esa forma. Si el archivo es un shell script que tiene la capacidad de contener un archivo binario (un tarball o similar) mejor. Hay varios distribuidores que usan esta metodologia, por ejemplo Nvidia, la cual resulta bastante comoda. Veamos un ejemplo sencillo.



El metodo a usar es bastante sencillo, se arma un tarball de la misma forma de siempre y con un 'cat tarball.tar.gz >> script.sh'  se le apendea al final del script. Teniendo la precaucion de no dejar ningun renglon en blanco luego del 'exit 0'.
El script al ejecutarse se quitara a si mismo de los primeros renglones dejando solo el binario, esto lo hace con la sentencia del sed, y luego redirige la salida al archivo almacenado en la variable '$MI_ARC'.

Al extraer el tarball se notara que finaliza con un error, esto se debe a como maneja los binarios el shell, si miramos el tarball que nos dejo el script en disco, podemos hacerlo con el comando 'cat archivo.tar.gz | od -ta', vamos a ver que el ultimo caracter es un "\n" cuando en el archivo original finaliza con un "null". Debido a esto el programa tar finaliza con error, aunque esto no imposibilita la extraccion exitosa del contenido del mismo. Solamente es una desprolijidad.
Hay varios "work-around" para esto pero el que mas me gusto por su disponibilidad tanto en LINUX como UNIX fue la del 'uuencode uudecode'. Mas alla de mi objetivo esta el explicar el funcionamiento de estas herramientas, pero basicamente lo que hacen es tomar el binario y recodificarlo usando la tabla de caracteres ASCII para permitir su transmision mediante un correo electronico. Con esta herramienta entonces podemos recodificar nuestro binario para que al ser apendeado al final del script no moleste el "\n".
Entonces con la modificacion realizada quedaria asi:



Esto es solamente un ejemplo sencillo sin demasiada complejidad, un detalle a tener en cuenta es que la sintaxis del uudecode-uuenconde varia en UNIX y LINUX.

Aqui algunos enlaces que me sirvieron de base para abordar el tema: