Automatización de copias de seguridad de bases de datos MySQL con mysqldump

Logotipo MySQLUna de las primeras obligaciones, si no la más importante, del administrador de un servidor de bases de datos, es mantener copias de seguridad funcionales y actualizadas de todas y cada una de ellas.

Nunca se sabe cuando algo puede ir mal: un disco duro, una memoria, caidas del sistema por algún problema de software o por el ataque de algún elemento mal intencionado…

En ese momento es cuando podremos resolver el problema de dos maneras, en unos pocos minutos restaurando la copia de seguridad ó backup del día anterior, o bien pasarnos varias horas mirando de restaurar copias antiguas o en el peor de los casos perdiendo totalmente el contenido de la base de datos.

En el artículo de hoy me gustaría hablar concretamente del gestor de bases de datos MySQL. En su instalación base viene acompañado de una herramienta de backup muy potente: mysqldump.

La herramienta permite hacer copias de seguridad de las tablas de una base de datos, de varias bases de datos o bien de todas ellas a la vez. Genera todas las instrucciones en lenguaje SQL necesarias para restaurar la base de datos al momento de la cópia, y las imprime en canal stdout (la pantalla); con lo que si las redirigimos a un fichero podremos guardarlo.

mysqldump --databases mibasededatos > backup_mibasededatos.sql

El único inconveniente lo encontramos si queremos guardar cada base de datos en un fichero separado de las demás. La opción –all-databases, o bien –databases db1 db2 … dbn imprimirán todo el código a la vez en stdout, sin distinción.

Es por ello que he desarrollado el siguiente script bash, el cual, ejecuta una instrucción en MySQL “SHOW DATABASES;” que nos imprime los nombres de todas las bases de datos en una lista, sobre la cual podremos realizar un bucle e ir ejecutando para cada una de ellas, una instrucción mysqldump.

  1. #!/bin/bash
  2.  
  3. # Ruta en la que se guarda el log de la operacion de backup.
  4. logfile="/path/to/mysql.log"
  5.  
  6. # Ruta en la que guardar los backups
  7. backup_dir="/path/to/saved/mysql"
  8.  
  9. # Usuario
  10. username="<nombre_usuario>"
  11. password="<password_de_acceso>"
  12.  
  13. # Creamos un nuevo log del proceso de backup
  14. rm -rf $logfile
  15. touch $logfile
  16.  
  17. # Mediante esta instruccion, generamos un nombre de fichero con el dia y la hora del proceso de backup.
  18. timeslot=`date +%Y%m%d_%H%M`
  19.  
  20. cd $backup_dir
  21.  
  22. # Iteramos a traves de la lista de bases de datos a la que el usuario tiene acceso.
  23. for BBDD in $( mysql -u $username --password=$password -h localhost -Bse 'show databases' ); do
  24. echo "Creando copia de seguridad de $BBDD"
  25.  
  26. # Volcamos la base de datos en un fichero temporal
  27. mysqldump --user=$username --password=$password $BBDD > datos.sql
  28.  
  29. # Y lo comprimimos en un tar.bz2 para ocupar lo mnimo. Util en bases de datos grandes.
  30. tar cvjf mysql-$BBDD-$timeslot.tar.bz2 *.sql
  31.  
  32. # El nombre del fichero resultante contiene el nombre de la base de datos y la fecha de la copia.
  33. # De esta manera, cuando sea necesaria su restauracion sera mas sencillo de localizar.
  34.  
  35. echo "Backup completo en la base de datos: $BBDD (mysql-$BBDD-$timeslot.tar.bz2)" >> $logfile
  36.  
  37. # Borramos el fichero temporal
  38. rm datos.sql
  39. done
  40. #-------------------------------------------------
  41.  
  42. #
  43. # Finalmente podemos enviar un email con el log de acciones para tener controlado el proceso de copia
  44. #
  45. cat $logfile|mail -s "Proceso Backup $HOSTNAME = MySQL" <direccion_email_de_control>

Y ya lo tenemos. Solamente quedará generar una tarea en el cron del sistema para que se ejecute de manera automática diariamente o cada X horas. A partir de aquí deberemos ir revisando que los backups se hacen de manera correcta y guardarlos ficheros en CD para almacenarlos fuera del servidor.

En un próximo artículo mostraré como subir, automáticamente y en el mismo proceso de backup, a un servidor FTP los ficheros de backup para maximizar la seguridad en caso de fallos.

12 Respuestas a “Automatización de copias de seguridad de bases de datos MySQL con mysqldump”


  1. 1 GonZoo

    Muy interesante el script, utilizaba uno más simple para mis copias dee seguridad pero me gusta más el tuyo así que lo he incorporado en mi trabajo.

    Gracias y un saludo

  2. 2 David García

    De nada, espero que te sea de mucha utilidad! :D

  3. 3 Maniaka

    Pero para eso necesitas tener acceso a uan shell, ¿no?. Muchos servidores web te permiten usar trabajos Cron pero sólo ejecutar scripts en PHP.

  4. 4 David García

    Si, seria lo mas sencillo. Si no es el caso podrías probar si el servidor te da acceso a las funciones “exec” o “shell_exec”. Así podrías ejecutar comandos en el servidor.

  5. 5 Dorisita

    Hola porfavor lo mas pronto !
    nmecesito entender :
    shell
    cron
    shell_exc
    lo q pasa es q me han pedido hacer un backup de una bd en mysql y luego restaurarla cada 7 horas ..por favor ayudeneme..porq nose mucho mysql

  6. 6 dgarcia

    Dorisita, las funciones shell o shell_exec se utilizan desde scripts php (lenguage de programacion web). En principio para hacer backups y luego restaurarlos no serian necesarios.

    El cron es relativamente sencillo de comprender. Basicamente le dices cada cuanto tiempo quieres que ejecute una tarea. En el wiki del Cron http://es.wikipedia.org/wiki/Cron_(unix) veras claro como se utiliza.

    En cuanto a lo de hacer backups, con el script que pongo aqui seria sencillo. Y para restaurar cada siete horas, tendrias que crear un script que descomprimiera el tar.bz2 y luego lo ejecutara mediante una instruccion:

    mysql basededatos < fichero_descomprimido

    A ver si así te oriento un poco mas.

  7. 7 fzr

    hola, todo funciona ok, lo q no se puede es enviar a mi mail
    el log :

    script.sh: 45: mail: not found

    que hay q configurar para q funcione, o q es lo que puede estar mal.
    GRACIAS.

  8. 8 David García

    Por el error, lo que sucede es que no tienes instalado el programa “mail” en tu distribucion linux. Si la instalas ya te funcionarà todo correctamente.

    En Ubuntu/Debian, por ejemplo, se instalaria mediante la instrucción de consola

    sudo apt-get install mail

    En otras distribuciones funcionará de manera similar. Consulta tu gestor de paquetes para ver de que manera se puede hacer.

    Un saludo,

  9. 9 jonzx3

    tengo el siguiente error
    jjjj@dddddd:~$ sudo ./crondb.sh
    “Creando copia de seguridad de mysql”
    tar: +%Y%m%d_%H%M.tar.bz2: No se puede stat: No existe el fichero o el directori o
    datos.sql
    tar: Salida con error demorada desde errores anteriores
    “Creando copia de seguridad de Ver”
    mysqldump: Got error: 1049: Unknown database ‘Ver’ when selecting the database
    tar: +%Y%m%d_%H%M.tar.bz2: No se puede stat: No existe el fichero o el directori o
    datos.sql
    tar: Salida con error demorada desde errores anteriores
    “Creando copia de seguridad de 14.12”
    mysqldump: Got error: 1102: Incorrect database name ‘14.12′ when selecting the d atabase
    tar: +%Y%m%d_%H%M.tar.bz2: No se puede stat: No existe el fichero o el directori o
    datos.sql

  10. 10 David García

    me parece que la linea 18 no la tienes bien.

    timeslot=`date +%Y%m%d_%H%M`

    ¿Has puesto las comillas tipo acento abierto (`) al principio y al final no?

    De esta manera el script interpreta que ha de asignar el contenido de la ejecución de “date”.

  11. 11 jonzx3

    Muchisimas gracias señor

  12. 12 David García

    De nada, a mandar! :D

  1. 1   Backups de Base de datos mysql + crontab by Sysadmin
    Dirección Pingback a 29 Ago., 2007, 15:28
  2. 2 Respaldar bases de datos MySQL automaticamente con Cron
    Dirección Pingback a 25 Sep., 2008, 18:40

Añade un Comentario