$ cat bash-mysql-dump-database.md

Debian

Bash mysql dump database

10 Nov 2021 · 4 min de lectura

Tenia la necesidad de hacer copias de seguridad de la base de datos, hay programas que te lo hace pero la mayoría son de pago, yo he estando utilizando SQLBak que va muy bien y era gratuito para Linux, pero ahora se hace de pago (para 2 bases de datos sigue siendo gratuito), por lo que hice el siguiente BASH para poder hacer las copias.

La base de datos es MariaDB 10.6 con la 10.5 también funciona bien.
El servidor es un Debian 11, actualizado desde el 10.

Fichero BASH:

#!/bin/bash

DATE=`date +%Y%m%d%H%M`
# Lista con las base de datos, se omiten las que estan entre ()
DATABASE_LIST="$(echo "show databases;" | mysql | grep -vwE "(DATABASE|Database|information_schema|mysql|performance_schema|sys)")"
# Directorio donde se hacen las copias de seguridad
BACKUP_DIR="/var/opt/copias_seguridad_db/"

# Ruta de logs, hacemos un fichero por mes, para que no se haga muy grande
# todo depende de cuantas copias al día se hacen, si es se puede hacer un log por
# base de datos o por día
RUTA_LOG="/var/opt/logs/"
NAME_FILE_LOG="log_database_"`date +%m%Y`".txt"
FECHA_HORA_LOG=`date +%d/%m/%Y_%H:%M:%S`


echo "----------EMPEZANDO LA COPIA DE SEGURIDAD DB----------"
echo " "
for database in $DATABASE_LIST; do
  # En caso de querer hacer el log por base de datos, descomentar la linea
  # NAME_FILE_LOG="log_database_"$database"_"`date +%m%Y`".txt"

  echo "Copia seguridad "$database
  echo $FECHA_HORA_LOG $database "Empezando copia" >> $RUTA_LOG$NAME_FILE_LOG

  # Lo separamos por bases de datos para que nos sea mas facil ver las copias
  CREATE_DIR=$BACKUP_DIR$database

  # Creamos el directorio
  if mkdir -p $CREATE_DIR; then
    cd $CREATE_DIR
    # Hacemos el dump de la $database
    if mysqldump -h IP_HOST -u USUARIO -pCONTRASEÑA --opt --create-options --add-drop-table --extended-insert --triggers --routines $database > $CREATE_DIR"/"$database-$DATE".sql"; then
      echo "Comprimiendo "$database-$DATE".sql -> "$database-$DATE".zip"

      # Comprimimos la base de datos para que ocupe menos espacio
      if zip $database-$DATE".zip" $database-$DATE".sql"; then
        echo "Borrando "$database-$DATE".sql"

        # Borramos el fichero SQL ya que no lo vamos a necesitar mas
        rm  $database-$DATE".sql";

        # Escribimos en el LOG que la copia ha finalizado correctamente
        echo $FECHA_HORA_LOG  $database "Copia finalizada" >> $RUTA_LOG$NAME_FILE_LOG
        
        # Ponemos aquí el borrado porque si lo pones al final del fichero va a Borrar
        # todas las copias antiguas, por si en algun momento falla alguna cosa
        echo "Borrando ficheros mas antiguos de 30 dias"
        find $CREATE_DIR* -type f -mtime +30 -delete
      else
        echo $FECHA_HORA_LOG $database "ERROR al comprimir el fichero "$database-$DATE'.zip' >> $RUTA_LOG$NAME_FILE_LOG
      fi
    else
      echo $FECHA_HORA_LOG $database "ERROR al hacer el mysqldump " >> $RUTA_LOG$NAME_FILE_LOG
    fi
  else
    echo $FECHA_HORA_LOG $database "ERROR al crear el directorio "$CREATE_DIR >> $RUTA_LOG$NAME_FILE_LOG
  fi

  echo " "
done
echo " "
echo "----------COPIA DE SEGURIDAD DB FINALIZADA----------";

Las opciones del mysql dump hay que revisarlas para ver si te sirven o no, os dejo un link con las opciones LinuxTotal
El script se puede mejorar, para que envié email si ha ido bien o guardarlo en una base de datos y luego sacar reportes, pero de momento esta es una primera versión.

Actualización: mejoras recomendadas

  • No pongas la contraseña en la línea de comandos. Con -pCONTRASEÑA cualquier usuario del servidor puede verla con ps. Guarda las credenciales en ~/.my.cnf (con chmod 600), sección [client] con user, password y host, y quita -h, -u y -p del mysqldump.
  • Usa --single-transaction con tablas InnoDB: hace el volcado consistente sin bloquear las tablas mientras se copia.
  • Prográmalo con cron. Por ejemplo, cada día a las 3:00: 0 3 * * * /usr/local/bin/backup_db.sh > /dev/null 2>&1
  • Prueba la restauración de vez en cuando; una copia que no se ha restaurado nunca no es una copia fiable. Para restaurar un fichero comprimido: unzip -p base-202611090300.zip | mysql nombre_base
  • Guarda también una copia en otro equipo (rsync, rclone u otro servidor), no solo en el mismo disco.

Temas:

0 comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *