Jorge Fuertes

Consultor de sistemas infomáticos.
Administración de sistemas, desarrollo.

Backups de MySQL con Bash

Estos días he tenido que hacer un script en bash para realizar backups de MySQL todos los días, guardando los últimos quince. Lo más sencillo era hacer este guión para ponerlo en el crontab y que se ejecutase a diario por la noche.

El script obtiene un listado de las bases de datos presentes en el MySQL local, crea un directorio dentro del que se le haya configurado, con nombre del día y la hora actuales, y dentro de él vuelca una por una estas bases de datos, comprimidas con gzip.

Después borra los backups viejos hasta dejar solamente los quince más nuevos.

Por supuesto el script se puede ejecutar a mano para producir un backup en el momento que deseemos, sólo hay que tener en cuenta que esos backups van a contar entre los quince últimos que son mantenidos.

Otra cosa importante es que el script tira de mi biblioteca de funciones de bash, que es una cosa que me facilita bastante la vida, sobre todo a la hora de darle un mejor aspecto a los scripts, pero es muy mejorable, como todo, y explicarla aquí se sale un poco del alcance del post, simplemente la adjunto porque la necesitáis. Está todo en este paquete backups-mysql-bash.tar.gz, pero en las instrucciones ya se descarga si las seguís paso a paso.

Instrucciones:

1: Instalar los scripts

Necesitáis tener instalado wget, si es Debian creo que viene por defecto, si no: apt-get install wget.


#> mkdir /root/bin
#> cd /root/bin
#> wget http://jorgefuertes.com/wp-content/uploads/2013/12/backups-mysql-bash.tar.gz
#> tar xvzf backups-mysql-bash.tar.gz

2: Configurar .my.cnf

Es interesante configurar este archivo para acceder sin más al servidor MySQL, en principio no es ningún problema de seguridad, pero si preferís no hacerlo deberéis modificar el script para que admita el usuario y la contraseña de vuestro mysql.

Editamos el archivo /root/.my.cnf (ojo al punto de delante del nombre) y escribimos en él:


[client]
host = localhost
user = root
password = mypassword

Evidentemente sustituyendo los datos con los que correspondan a nuestro servidor.
Ahora si ejecutamos mysql deberemos conectar con el servidor sin problemas.

Ajustamos los permisos de este fichero para que sean restrictivos y otros usuarios de la máquina no puedan usarlo o leerlo:


chmod 600 /root/.my.cnf

3: Probar el script

Si todo ha ido bien tiene que funcionar a la primera:


#> /root/bin/backup-mysql.sh

Lo podemos ejecutar varias veces y observar el resultado en /root/backup.

4: Añadirlo al crontab

Añadiremos una línea al crontab para conseguir que se ejecute todos los días a las 12 de la noche. El fichero de cron se edita con la orden crontab -e.


# m h  dom mon dow   command
0 0 * * * /root/bin/backup-mysql.sh

Bien, con esto ya debería estar resuelto. Fácil, estúpido y funcional, KISS, pero nos puede salvar el pescuezo en más de una ocasión.

2 comments for “Backups de MySQL con Bash

  1. 23 December 2013 at 11:08

    El –skip-lock-tables del mysqldump hace que los restores no puedan garantizar la consistencia de los datos. No recomiendo esa opción a menos que se pueda asegurar que no hay ninguna escritura durante la duración del backup. Hay varias opciones disponibles, por ejemplo, migrar a InnoDB y usar –single-transaction, si es que el backup no tarda demasiado para que haya demasiado overhead en la zona de UNDO. Recomiendo también echar un vistazo a soluciones alternativas, más flexibles, como mydumper o xtrabackup.

    Ya, por meter el dedo en la nariz, me gusta más cómo lo hago yo:
    mysql -BN -e “SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN (‘information_schema’, ‘performance_schema’)”

    Porque la gente no crea cosas como test_schema o my_schema… En ambos casos, fallaríamos en hacer backup de bases de datos creadas o borradas entre llamadas. Pero nadie crea o borra bases de datos a las 12 de la noche, verdad? Nadie en su sano juicio!!!!! Mejor no preguntes porqué lo digo… Simplemente odio a la gente.

  2. 23 December 2013 at 11:17

    😀 Gracias por tus comentarios Jaime, serán tenidos en cuenta.

    He publicado esto hace menos de un día y ya he sacado un par de ideas muy buenas, que el Xayon también me ha pasado su biblioteca de funciones bash que no conocía: https://github.com/XayOn/yabatool

    ¡Saludos!

Comments are closed.