Copias de seguridad de MariaDB automatizadas

La probabilidad de que tengas una o varias bases de datos en MariaDB, si eres lector habitual o esporádico, o simplemente has caído por primera, vez aquí es elevada. Muy elevada diría yo. Lo mas normal, es que tengas tu propio servidor de bases de datos de MariaDB alojado en una Raspberry, en un VPS o en cualquier otro sitio. Y estas bases de datos pueden ser las responsables de tu página web, o contener los datos de un servicio web, o incluso de las estadísticas de la liga. La cuestión es que sea por la razón que sea que tengas bases de datos de MariaDB, es interesante que realices copias de seguridad de MariaDB. Así, en este artículo, te voy a comentar, no solo cmo puedes realizar copias de seguridad de MariaDB, sino que además te indicaré como hacer esas copias de seguridad de MariaDB automatizadas

Copias de seguridad de MariaDB automatizadas

Copias de seguridad de MariaDB automatizadas

Para realizar copias de seguridad de MariaDB existen diferentes herramientas. De entre estas herramientas cabe destacar Mariabackup que te permite realizar copias de seguridad físicas y mysqldump que lo que hace son copias lógicas.

La diferencia básica entre un tipo y otro radica en que las físicas se realizan a nivel de archivo y directorio, mientras que las lógicas, se hacen a nivel de instrucciones de SQL. Cada tipo tiene sus ventajas e inconvenientes, sin embargo, indicarte que lo mas frecuente es realizar copias lógicas.

mysqldump

Como he comentado anteriormente, mysqldump realiza copias de seguridad del tipo lógico. Esto te da mayor flexibilidad a la hora de realizar resguardos y restauraciones. Este sistema es especialmente interesante con volumenes de datos relativamente pequeños. Conforme va creciendo, tanto copias como restauraciones se convierten en procesos relativamente pesados, y seguro que te conviene decantarte por la otra alternativa.

Esta herramienta lo que hace es volcar el contenido de tu base de datos en formato SQL. Esto tiene la ventaja de que no solo lo podrás importar en una base de datos de MariaDB, sino que podrás utilizar otro servidor de bases de datos. Todo dependerá de las compatibilidades de ambas bases de datos con SQL.

Además de las tablas de una base de datos, mysqldump, realiza copias de seguridad de los triggers, dado que son parte de la definición de una tabla. Sin embargo, eventos, vistas y procedimientos no se guardan por defecto. Es necesario indicar, al hacer la copia de seguridad, que también quieres incluir en la misma esta información.

¿Como hacer una copia de seguridad?

La cuestión es tan sencilla como ejecutar este comando en un terminal,

mysqldump --user=<usuario> --password --databases <base_datos> > <archivo>

Esto se puede simplificar a,

mysqldump -u <usuario> -p <base_datos> > <archivo>

Algunas observaciones al respecto,

  • mysqldump te pedirá una contraseña antes de comenzar con la copia de seguridad.
  • La copia de seguridad se realiza en el directorio en el que ejecutas esta instrucción.
  • Es conveniente poner una fecha a nuestro archivo de copia de seguridad para tener nuestros resguardos lo mas ordenados posible. Para esto puede utilizar algo como,
copia_de_seguridad_$(date +%Y%m%dT%H.%M.%S).sql

que te dará un resultado como,

copia_de_seguridad_20190425T19:25:58.sql

Si lo que quieres es realizar una copia de seguridad de toda la base de datos, la instrucción que tienes que ejecutar es,

mysqldump --user=usuario --password --lock-tables --all-databases > copia_de_seguridad_$(date +%Y%m%dT%H.%M.%S).sql

En el caso que solo lo quieras hacer de una única base de datos,

mysqldump --user=usuario --password --lock-tables --databases base_de_datos > copia_de_seguridad_$(date +%Y%m%dT%H.%M.%S).sql

Y si lo único que quieres es hacer una copia de seguridad de una tabla de la base de datos, la instrucción quedará como sigue,

mysqldump --user=usuario --password --lock-tables --databases base_de_datos tabla > copia_de_seguridad_$(date +%Y%m%dT%H.%M.%S).sql

¿Que opciones hemos establecido?

Las opciones que he incluido en cada una de las instrucciones indicadas anteriormente indican lo siguiente,

  • --all-databases realiza una copia de seguridad de todas las bases de datos.
  • --lock-tables bloquea las tablas cuando se realiza la copia de seguridad.
  • --skip-quick por defecto se realiza la copia de seguridad de las tablas fila a fila. Sin embargo, para el caso de tablas con pocos datos, es posible, realizarlo de un sola vez, guardando toda la información en memoria de forma temporal. Esto lo puedes hacer utilizando esta opción.

Comprimir la copia de seguridad

Es mas que buena idea la de guardar nuestra copia de seguridad comprimida. Mas que nada por aquello de ahorrar espacio en nuestro equipo. Esto lo podemos realizar en una sola línea. Para ello te recomiendo que le des un vistazo al capítulo de redirigir entrada y salida en Linux, del tutorial sobre el terminal. Esto quedaría como,

mysqldump --user=usuario --password --lock-tables --all-databases | gzip > copia_de_seguridad_$(date +%Y%m%dT%H.%M.%S).sql.gz

En el caso de que quisieras descomprimir tu copia de seguridad, la instrucción sería,

gunzip copia_de_seguridad_20190425T19.25.58.sql.gz

Restaurar copias de seguridad

Hasta hora lo que has visto, y por lo que te has preocupado ha sido realizar tu copia de seguridad. Sin embargo, tan importante es realizar la copia de seguridad como su respaldo. Así en el caso de que no hayas comprimido la copia de seguridad, la instrucción a ejecutar será,

mysql --user=usuario --password < copia_de_seguridad_20190425T19.25.58.sql

Si utilizaste compresión, en ese caso, para restaurar la copia de seguridad sería,

gunzip < copia_de_seguridad_20190425T19.25.58.sql | mysql --user=usuario --password

Automatizar la copia de seguridad

Como te puedes imaginar realizar copias de seguridad de forma manual, es algo realmente absurdo. No solo porque es una labor totalmente tediosa e improductiva, sino también, porque es fácil que te olvides de hacer la copia de seguridad. Y, te puedo asegurar, que al día siguiente de que te olvides de hacer la copia de seguridad la vas a necesitar.

usuario y contraseña

Para automatizar la copia de seguridad de tu base de datos, el primer paso es crear un archivo con los datos del usuario y contraseña. En este caso root. Esto te evitará tener que escribirlo directamente en el script que utilizarás para la copia de seguridad. Con el fin de no poner la contraseña en el script, que sinceramente quedaría muy feo, tienes que crear un archivo de configuración /root/.my.cnf, con el siguiente contenido,

[mysqldump]
user = <usuario>
password = <contraseña>

Que como indico, para el caso que te ocupa, en el que utilizas root,

[mysqldump]
user = root
password = <contraseña_de_root>

Por otro lado, tienes que definir permisos para este archivo,

chmod 600 /root/.my.cnf

A partir de este momento, cada vez que ejecutes mysqldump, la cuestión se simplifica considerablemente, en tanto en cuanto, no tienes que pasar ni usuario ni contraseña, tan solo,

sudo mysqldump --all-databases | gzip > copia_de_seguridad_$(date +%Y%m%dT%H.%M.%S).sql.gz

Borrando copias antiguas

Además de realizar la copia de seguridad, es interesante borrar las copias muy antiguas. Si haces una copia de seguridad todos los días, te puedes plantear borrar las que tengan mas de una semana de antigüedad. Para ello, primero establecemos la fecha límite,

limite=$(date +%Y%m%dT%H.%M.%S -d "-7 days")

Y para hacer el borrado utilizaremos lo siguiente,

limite=$(date +%Y%m%dT%H.%M.%S -d "-7 days")
for i in *sql.gz
    do
    if [[ ${i:19:17} < $limite ]]
    then
        rm $i
    fi
done

El script completo.

Así, si juntas todas las piezas del rompecabezas, el primer paso sería crear la copia de seguridad y si todo ha salido bien, borrar las copias antiguas. En el caso de que algo haya fallado, tendríamos que avisar. Para esta operación, lo interesante, al menos desde mi punto de vista, sería enviar un mensaje utilizando Telegram, por ejemplo.

#!/bin/bash
pcds=/var/opt/mariadb
cds=$pcds/copia_de_seguridad_$(date +%Y%m%dT%H.%M.%S).sql
mysqldump --all-databases --lock-tables > $cds
if [ $? -eq 0 ]
then
    gzip $cds
    limite=$(date +%Y%m%dT%H.%M.%S -d "-7 days")
    for i in $pcds/*.sql.gz
        do
        if [[ ${i:36:17} < $limite ]] && [[ -e $i ]]
        then
            rm $i
        fi
    done
else
    if [[ -e $cds ]]
    then
        rm $cds
    fi
    source /root/.telegram_keys
    URL=https://api.telegram.org/bot$TOKEN/sendMessage
    message="No se ha podido hacer la copia de seguridad"
    curl -s -X POST $URL -d chat_id=$CHANNEL -d text="$message" >/dev/null 2>&1
fi

Esto te enviaría un mensaje a un canal de Telegram. Para esto es necesario que crees el archivo /root/.telegram_keys con el siguiente contenido,

#!/bin/bash
TOKEN=123456789:ASDDFAERIJDAKLJFLKDJAFLKJDAS
CHANNEL=-1001234567890

Es conveniente que le pongas los permisos adecuados a este archivo, para que solo tenga acceso root. Para ello, ejecuta, como antes la siguiente instrucción,

chmod 600 /root/.telegram_keys

La automatización

Para completar todo el proceso, es necesario que esto esté completamente automatizado. Para ello, puedes utilizar cron o bien, utilizar Systemd. Yo, como en otros casos me decantaré por esto último. De esta forma, tienes que crear un servicio, como backupmdb.service con el siguiente contenido,

[Unit]
Description=Back up all MariaDB databases

[Service]
Type=oneshot
ExecStart=/bin/bash /opt/backupmdb/backup.sh

Y por otro lado, necesitarás crear el timer, que será algo como,

[Unit]
Description=Run backupmdb service every day

[Timer]
OnCalendar=daily

[Install]
WantedBy=timers.target

Estos dos sencillos archivos los tienes que colocar en /lib/systemd/system, y cuando ya lo tengas todo listo, solo tienes que ejecutar la siguiente instrucción,

sudo systemctl start backupmdb.timer

Y ya lo tienes todo perfectamente funcionando.

Indicar que en el timer puedes indicar dos horarios. Así podrías hacer una copia diaria y una semanal, o cualquier otra composición que te puedas o quieras imaginar.

Instalación

Como de costumbre, para facilitarte el trabajo, y si no quieres pelearte con esto, he subido toda la información a un repositorio de GitHub. Para instalarlo en tu equipo, es tan sencillo como que ejecutes las siguientes instrucciones en un terminal,

git clone https://github.com/atareao/backupmdb.git

Una vez hayas realizado la copia, tendrás que modificar los archivos para adecuarlos a tus necesidades. Recuerda que es importante tanto configurar la cuenta de Telegram como tus datos para MariaDB.

Conclusiones

Ciertamente, que lo que había empezado como un HowTo para crear una copia de seguridad de tus bases de datos de MariaDB, se ha ido alargando y alargando, hasta convertirse en un pequeño mostruito. Lo cierto es que ha quedado bastante completo, y creo que te puede ser de utilidad. Es posible que no en todas sus partes, pero a lo mejor en alguna de ellas. Sea como fuere, espero que te sea de utilidad.


Más información,

Deja un comentario

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