Bash mysql dump database

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.

Deja un comentario

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

Captcha cargando...