Script para respaldar todas las bases de datos de un servidor MySQL

Hoy en la mañana estaba leyendo este artículo llamado Script para backups automáticos de tu servidor lo vi y me pareció una buena idea hacer uno propio para respaldar todas las bases de datos que tengo en mi servidor MySQL.

Tomé prestadas algunas ideas del script que muestran en DesdeLinux.net y otras del sitio Tail -f Backup de todas las bases de datos MySQL en archivos separados.

El script de DesdeLinux es muy completo, hacen un respaldo de varios archivos, un vaciado de las bases de datos que consideran importantes y hasta envía un correo electrónico a los administradores con el resultado del respaldo. En lo personal a mi me gusta copiar archivos utilizando el comando rsync, pero esa es otra historia.

Al principio intenté hacer un mysqldump de todas las bases de datos en un solo archivo, pero el resultado fue un mega archivo de 27 MB que era muy difícil de abrir para gedit (o cualquier otro editor de texto). Si solo necesito restaurar una base de datos en lugar de todas la tarea se puede complicar un poco.

Por eso que decidí generar un solo archivo para cada base de datos del servidor MySQL. Ahí es donde entra en acción el script de Tail que explica muy bien como generar un archivo independiente por cada base de datos.

El resultado es un archivo por cada base de datos que incluye en el nombre del archivo la fecha en la que fue realizado el respaldo.

El script esta diseñado para ejecutarse en un equipo diferente al que ejecuta el servidor de base de datos, aunque supongo que si le ponen localhost en la variable IP_SERVIDOR_MYSQL también puede funcionar.

Como un plus, el script realiza una optimización y reparación de todas las bases de datos del servidor antes de hacer el vaciado de las bases de datos.

#!/bin/sh
#
# Este programa es software libre. Puede redistribuirlo y/o
# modificarlo bajo los términos de la Licencia Pública General
# de GNU según es publicada por la Free Software Foundation,
# bien de la versión 2 de dicha Licencia o bien (según su
# elección) de cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea
# útil, pero SIN NINGUNA GARANTÍA, incluso sin la garantía
# MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN
# PROPÓSITO PARTICULAR. Para más detalles, véase la Licencia
# Pública General de GNU.
#
# Copyleft 2012
# Autor: Linuxman inguanzo@gmail.com https://linuxmanr4.com 
# versión 2.0

NAME="MySQL Backup"                                 # Nombre script.
                                                    # Descripción: Script para hacer un respaldo de todas las bases de datos de un servidor MySQL.
: ${DATE:=$(date +'%Y-%m-%d')}                      # Variable para Fecha.
: ${TIME:=$(date +'%R')}                            # Variable para Hora.
: ${WORK_DIR:=/home/usuario/directorioderespaldo/}  # Directorio de trabajo. 
: ${IP_SERVIDOR_MYSQL:=IP_DEL_SERVIDOR_MYSQL}       # Dirección del servidor MySQL. 
: ${USUARIO:=root}                                  # Usuario con privilegios a la base de datos. Ej. root
: ${DB_PASS:=CONTRASEÑA}                            # La contraseña de root de nuestro servidor MySQL. 


# Antes de respaldar optimizamos y reparamos las bases de datos.
clear
echo "Revisando y reparando las bases de datos."
echo "========================================="
mysqlcheck -c -A --auto-repair -h $IP_SERVIDOR_MYSQL -u $USUARIO --password=$DB_PASS

echo
echo "Optimizando las bases de datos."
echo "========================================="
mysqlcheck -A -o -h $IP_SERVIDOR_MYSQL -u $USUARIO --password=$DB_PASS

# Cambiamos a nuestro directorio de trabajo
cd $WORK_DIR

echo
echo "Iniciando el vaciado de todas las bases de datos."
echo "================================================="

# Iniciamos un vaciado de todas las bases de datos del servidor.
TABLES=`mysql -h $IP_SERVIDOR_MYSQL -u$USUARIO --password=$DB_PASS --execute="SHOW DATABASES;" |awk '{print($1)}' |grep -v "Database" |grep -v "information_schema"`
for table in $TABLES; do
    echo "Respaldando la tabla $table..."
    file=$table.respaldo_`date +%Y%m%d`.sql
    mysqldump  -h $IP_SERVIDOR_MYSQL -u"$USUARIO" -p"$DB_PASS" $table > $file
    echo "Comprimiendo $file ..."
    gzip $file
done

echo
echo "RESPALDO TERMINADO!!!"

Ajustando los parámetros

Para utilizarlo es necesario descargar el archivo, abrirlo y modificar los parámetros

  • WORK_DIR Es la ruta donde quieres que se guarden los archivos.
  • IP_SERVIDOR_MYSQL Es la dirección ip del servidor, también podría funcionar un nombre de dominio o si el servidor es la misma maquina en la que se ejecuta el script localhost sería lo correcto.
  • USUARIO Un usuario con los permisos de acceso necesarios, root funciona la mayoría de las veces.
  • DB_PASS La contraseña del usuario 🙂

Para ejecutar el script es necesario darle permisos de ejecución con:

chmod +x respaldo_mysql.sh

Y suerte !!!

El script funciona muy bien en mi equipo y espero que en el de ustedes también. Si tienen alguna duda favor de poner un comentario.

Descargar respaldo_mysql.sh

Actualización. Este script dejó de funcionar por un error al intentar ejecutar varias tareas de manera simultánea, pueden ver la versión más reciente en: Script para respaldar bases de datos MySQL versión 2.

8 comentarios en “Script para respaldar todas las bases de datos de un servidor MySQL”

  1. excelente soy nuevo en linux y aprendo con bolita palito como dicen jejeje
    se que es mucho pedir pero seria bueno como sigerencia poner

    1.-abre tu linux
    2.-poner este comando “x”.sh
    3.-despues este comando .sh y te pedira el nombre de tu server ejemplo “root”
    4.- este comando sh. va tu correo electronico
    etc.

    pero gracias por la ayuda ojala se pueda

    saludos

    Responder
  2. Hola que buen scritp para los respaldos nose mucho sobre linux y me ha sido de gran ayuda solo tengo una pregunta si quisiera hacer un respaldo incremental a partir del completo como seria de antemano muchas gracias…

    exelente dia

    Responder
  3. Excelente tu script me sirvió mucho, solo que me marco el siguiente error al ejecutar la siguiente sentencia:

    mysqlcheck -c -A –auto-repair -o -h localhost -u root -p”pws”

    Error: mysqlcheck doesn’t support multiple contradicting commands.

    Y como lo mencionaste en versiones recientes no permite múltiples comandos, así que con la versión dos que sugeriste quedo funcionando.

    Muchas gracias por tu compartir tus conocimientos.

    Responder
    • Así es Arturo,

      Este problema se soluciona en la versión 2 del script separando estas tareas, de esa forma ya no marca el error.

      Tengo una versión más reciente que imprime en el nombre del archivo la fecha y la hora, para que no te de error si ejecutas dos o más veces el script el mismo día.

      Saludos.

      Responder
  4. Buenas elenlace del script 1 no me funciona, podrías checar. Gracias por la información. También estoy iniciando en el desarrollo de script .sh. De nuevo muchas gracias por compartir tu conocimiento.

    Responder

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.