Un script simple pero muy útil es el que desarrollé para respaldar todas las bases de datos de MySQL en un sistema operativo Linux. Casi cualquier sistema requiere de generar un respaldo diario, principalmente de las bases de datos y depositarlas en lugar seguro (si se puede en un servidor externo).
Para empezar hay que hacer un trabajo previo, que es básicamente definir donde se requiere hacer almacenar los respaldo, guardar las contraseñas de MySQL en un lugar seguro y localizar las rutas de los commandos mysql y mysqldump (esto último es opcional).
Paso 1
El siguiente ejemplo, creo una carpeta llamada «db_backups» dentro del directorio root, de esta forma aseguro que su acceso será restringido sólo al usuario root y el usuario que esté dentro del grupo root.
$ mkdir db_backups
$ ls -la
-rw------- 1 root root 12639 Dec 16 22:42 .bash_history
-rw-r--r-- 1 root root 721 Aug 6 2019 .bashrc
drwx------ 3 root root 4096 Aug 7 2019 .config
drwxr-xr-x 18 root root 4096 Dec 30 02:00 db_backups
Listo, ya se tiene el directorio donde se estarán almacenando los respaldos.
Paso 2 (Opcional)
Ahora procedo a crear el directorio «scripts» donde guardaré las credenciales y el script que genere los respaldos diarios. Este paso es opcional, pero yo lo hago porque a mi me gusta tener todo más organizado.
$ mkdir scripts
$ ls -la
-rw------- 1 root root 12639 Dec 16 22:42 .bash_history
-rw-r--r-- 1 root root 721 Aug 6 2019 .bashrc
drwx------ 3 root root 4096 Aug 7 2019 .config
drwxr-xr-x 18 root root 4096 Dec 30 02:00 db_backups
drwxr-xr-x 2 root root 4096 Dec 30 02:05 scripts
Nos aseguramos que igualmente el script tenga los permisos adecuados.
Paso 3
Creamos el documento donde pondremos las credenciales de la base de datos usando tu editor de texto favorito (para mi el mejor es emacs)
$ cd scripts
$ emacs mysql_creds.cnf
Y escribimos las credenciales. Este paso es importante, porque debes ingresar las credenciales de un usuario que tenga permisos para generar respaldos de todas tus bases de datos.
Escribe las credenciales de tu usuario de esta forma dentro del archivo «mysql_creds.cnf»:
[client]
user=dbdumps
password=XXXXX
Ahora creamos script que hará toda la magia
$ emacs mysqldumpall.sh
Y copiamos el siguiente código dentro de este archivo:
#! /bin/bash
TIMESTAMP=$(date +"%F")
BACKUP_DIR="/root/db_backups/$TIMESTAMP"
MYSQL_CREDS="/root/scripts/mysql_creds.cnf"
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
mkdir -p "$BACKUP_DIR"
databases=`$MYSQL --defaults-extra-file=$MYSQL_CREDS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"`
for db in $databases; do
$MYSQLDUMP --defaults-extra-file=$MYSQL_CREDS --single-transaction --databases $db | gzip > "$BACKUP_DIR/$db.sql.gz"
done
Aquí es importante que las constantes MYSQL_CREDS
y BACKUP_DIR
apunte a los directorios donde se creo la carpeta que almacenará los backups y donde se encuentran las credenciales.
Agregamos permisos de ejecución al script:
$ chmod +x mysqldumpall.sh
Paso 4 – Cronizar
Ahora solo debemos cronizar la ejecución de nuestro script, para ello usamos crontab
$ crontab -e
Y agregamos esta línea al final del documento
45 1 * * * /bin/bash /root/scripts/mysqldumpall.sh
Aquí estoy programando que el script que respalde todas las bases de datos se ejecute a la 1:45am cada día.
Paso 5 – Borrado automático
Finalmente, para evitar almacenar demasiados respaldos, podemos dentro del mismo crontab, crear una tarea que borre todos los respaldos mayores a ciertos días.
0 2 * * * find db_backups/ -depth -mtime +10 -exec rm -rf {} \;
Aquí yo solo mantengo los respaldos de los últimos 10 días. Puedes aumentar este número dependiendo de cuánto tiempo quieres conservar los respaldos.