Automatizar copias de seguridad de MySQL y sitios web con Bash

Automatizar copias de seguridad de MySQL y sitios web con Bash

Las copias de seguridad son una de las tareas más importantes en la administración de servidores. Un fallo de hardware, un error humano o un ataque informático pueden provocar la pérdida de datos críticos. Por esta razón, es recomendable automatizar los respaldos de sitios web y bases de datos.

En este artículo presentamos un script Bash sencillo que permite:

  • Realizar una copia de seguridad de una base de datos MySQL.
  • Comprimir los archivos de un sitio web.
  • Transferir automáticamente los respaldos a un servidor externo.
  • Eliminar los archivos temporales una vez finalizado el proceso.
#!/bin/bash
# Archivo BASH de respaldo
# Delarosa
# 12.04.2024

####### Fecha y rutas #######
fecha=$(date +%Y-%m-%d-%H-%M)
nombre_respaldo=''
ruta_root=''
ruta_web=''

####### Datos de la base de datos ########
nombre_bd=''
usuario_bd=''
contrasena_bd=''

####### Servidor de respaldo #######
servidor=''
usuario_servidor=''
contrasena_servidor=''

#####################################
# Inicio de la copia de seguridad   #
#####################################

####### Definir ruta inicial !!! #######
cd ${ruta_root}

####### Respaldar base de datos #####
mysqldump -u ${usuario_bd} -p${contrasena_bd} ${nombre_bd} > ${nombre_respaldo}_${fecha}.sql

####### Respaldar datos #######
cd ${ruta_web}
zip -r ${nombre_respaldo}_${fecha}.zip * .htaccess
mv ${nombre_respaldo}_${fecha}.zip ${ruta_root}

cd ${ruta_root}

####### Subir todo al servidor ######
curl -T ${nombre_respaldo}_${fecha}.sql -u${usuario_servidor}:${contrasena_servidor} ${servidor}
curl -T ${nombre_respaldo}_${fecha}.zip -u${usuario_servidor}:${contrasena_servidor} ${servidor}

####### Eliminar archivos antiguos #######
rm *.zip
rm *.sql

echo "#########################################"
echo "#                                       #"
echo "#  Todo respaldado en servidor externo  #"
echo "#  Por favor verificar ...              #"
echo "#                                       #"
echo "#########################################"

Variables de configuración – Bash

Antes de ejecutar el script es necesario configurar algunos parámetros:

fecha=$(date +%Y-%m-%d-%H-%M)
nombre_respaldo=''
ruta_root=''
ruta_web=''

Estas variables definen la fecha utilizada en los nombres de los archivos, el nombre del respaldo y las rutas de trabajo.

Para la base de datos se utilizan las siguientes variables:

nombre_bd=''
usuario_bd=''
contrasena_bd=''

Y para el servidor de almacenamiento externo:

servidor=''
usuario_servidor=''
contrasena_servidor=''

Respaldo de la base de datos

El script utiliza mysqldump para exportar el contenido completo de la base de datos MySQL:

mysqldump -u ${usuario_bd} -p${contrasena_bd} ${nombre_bd} > ${nombre_respaldo}_${fecha}.sql

El resultado es un archivo SQL que contiene toda la estructura y los datos de la base de datos.

Compresión de los archivos del sitio web

Posteriormente se crea un archivo ZIP con todos los archivos del sitio web:

zip -r ${nombre_respaldo}_${fecha}.zip * .htaccess

La opción -r permite incluir todos los directorios y subdirectorios de forma recursiva.

Transferencia al servidor de respaldo

Una vez generados los archivos, el script los envía a un servidor remoto mediante curl:

curl -T ${nombre_respaldo}_${fecha}.sql -u${usuario_servidor}:${contrasena_servidor} ${servidor}
curl -T ${nombre_respaldo}_${fecha}.zip -u${usuario_servidor}:${contrasena_servidor} ${servidor}

De esta manera los respaldos se almacenan fuera del servidor principal, aumentando la seguridad frente a fallos o incidentes.

Limpieza automática

Después de la transferencia, los archivos locales son eliminados para evitar que ocupen espacio innecesario:

rm *.zip
rm *.sql

Automatización con Cron

Para que el proceso se ejecute automáticamente cada día, se puede añadir una tarea programada mediante cron.

Ejemplo para ejecutar el script todos los días a las 03:00 de la madrugada:

0 3 * * * /ruta/al/script/backup.sh

Ventajas de esta solución

  • Automatización completa del proceso de respaldo.
  • Copia simultánea de archivos y base de datos.
  • Almacenamiento externo de los respaldos.
  • Reducción del riesgo de pérdida de datos.
  • Implementación sencilla en cualquier servidor Linux.

Conclusión

Este script Bash ofrece una solución práctica y eficiente para proteger sitios web y bases de datos MySQL. Aunque se trata de una implementación sencilla, cubre los aspectos fundamentales de una estrategia de respaldo automatizada: generación de copias, almacenamiento externo y limpieza automática.

Para entornos de producción se recomienda complementar esta solución con cifrado de archivos, retención de múltiples versiones y notificaciones automáticas por correo electrónico para verificar el éxito de cada respaldo.