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.