En este tutorial de Linux vamos a ver cómo respaldar o hacer un backup de una base de datos completa de MySQL o MariaDB usando la utilidad de MySQLDump también llamada mysqldump.
Todo eso será llamado desde un script sh programado por nosotros.
Por otro lado, veremos cómo no exponer nuestras credenciales de acceso para llamar al comando sin pasarle nuestra contraseña, evitando así riesgos de seguridad.
La segunda parte del tutorial (que traeré muy pronto) indicará cómo respaldar una base de datos periódicamente con cron, es decir, respaldarla cada mes, a diario o cada determinado tiempo.
Nota: este tutorial está probado con ubuntu 16.04 y 18.10 pero debería funcionar para otras versiones. Por cierto, aquí puedes ver cómo instalar y configurar MySQL en Linux en caso de que no lo tengas instalado.
Paso 1: probar credenciales
Primero que nada, verifica que puedes loguearte en el servidor. Para ello mira este tutorial de introducción a la línea de comandos con MySQL o escribe:
mysql -u tu_usuario -p
En este caso lo haré con root, así:
mysql -u root -p
Eso preguntará la contraseña y si está bien, nos dejará pasar:
Paso opcional: crear base de datos de prueba
Si quieres probar sin una base de datos real, crea una llamada pruebas así:
create database pruebas;
use pruebas;
create table contactos(nombre varchar(255), sitio_web varchar(255));
insert into contactos values
('Luis Cabrera Benito', 'parzibyte.me'),
('Luis Cabrera Benito', 'parzibyte.me'),
('Luis Cabrera Benito', 'parzibyte.me'),
('Luis Cabrera Benito', 'parzibyte.me');
Ahora sí podemos continuar.
Paso 2: probar mysqldump sin script
Antes de programar el script vamos a ver si la utilidad de mysqldump
funciona. La sintaxis es:
mysqldump -u usuario -p base_de_datos > /ruta/al/respaldo
En mi caso quiero el respaldo en /home/cabox/bd.sql, mi usuario es root y la base de datos es pruebas así que queda así:
mysqldump -u root -p pruebas > /home/cabox/bd.sql
El script preguntará la contraseña (para el script no vamos a escribirla, pero vamos paso por paso) así que la escribimos. Luego verificamos que el respaldo tenga datos con:
tail /home/cabox/bd.sql
Todo eso se ve en la siguiente imagen:
No importa el contenido del respaldo, sino que tenga contenido. Podemos continuar entonces.
Paso 3: crear archivo de configuración de MySQL y pasarlo a mysqldump
Cuando programamos un script para respaldar una base de datos en MySQL, no vamos a escribir nuestra contraseña. Una opción es pasarla así:
mysqldump -u usuario -pLaContraseñaAquíJuntoALaLetraP base_de_datos > /ruta/absoluta.sql
Pero estamos pasando la contraseña en la línea de comandos, y si alguien más listara los procesos con:
ps
Vería nuestro comando, y lo vería durante el proceso de respaldo; dependiendo de la base de datos esto sería corto o largo, pero mejor no nos arriesgamos.
Lo bueno de MySQL es que nos permite pasarle un archivo de configuración con nuestras credenciales, y eso es lo que haremos. Así le indicamos en dónde está el usuario y la contraseña, pero no las escribimos en el comando.
Más tarde podemos configurar ese archivo para que solamente nosotros podamos leerlo, pero esa es otra historia.
Entonces creamos el archivo de configuración (recomiendo usar nano) en una ruta que recordemos, recomiendo que sea en ~/ con extensión .cnf
, el mío será my.cnf y lo pondré en /home/cabox/my.cnf con el siguiente contenido:
[mysqldump]
user=root
password=hunter2
Obviamente cámbialo de acuerdo a tus credenciales, y después guarda cambios.
Nota: no recomiendo hacerlo con root, mejor crea un nuevo usuario pero lo dejo a tu criterio. El mío queda así:
Luego le asignamos permisos con:
sudo chmod 600 my.cnf
Ya tenemos configurado nuestro archivo.
Paso 4: respaldar con mysqldump sin contraseña
Finalmente probamos el comando de mysqldump pero con distintas opciones:
mysqldump --defaults-file=/ruta/al/archivo/de/configuracion.cnf nombre_base_de_datos > /ruta/absoluta/salida/del/respaldo.sql
Ahora no pasamos ni el usuario ni la contraseña, solamente el nombre de la base de datos, el archivo de configuración y la ruta de salida. El mío queda así:
mysqldump --defaults-file=/home/cabox/my.cnf pruebas > /home/cabox/bd.sql
Listo, si configuramos todo correctamente, el respaldo estará en la ruta de salida. Queda comprobado en la siguiente imagen:
Paso 5: script sh para respaldar base de datos
Una vez que aprendimos todo esto, meterlo en un script no cuesta nada. El código final es este:
#!/bin/bash
# Respaldar base de datos de MySQL con
# mysqldump y archivo de configuración
# @author parzibyte | Visita: parzibyte.me/blog
NOMBRE_BASE_DE_DATOS="pruebas"
RUTA_ARCHIVO_CONFIGURACION="/home/cabox/my.cnf"
RUTA_SALIDA_RESPALDO="/home/cabox/"
NOMBRE_ARCHIVO_RESPALDO="bd.sql"
RUTA_ARCHIVO_RESPALDO="$RUTA_SALIDA_RESPALDO/$NOMBRE_ARCHIVO_RESPALDO"
mysqldump --defaults-file=$RUTA_ARCHIVO_CONFIGURACION $NOMBRE_BASE_DE_DATOS > $RUTA_ARCHIVO_RESPALDO
Más tarde se le da permisos de ejecución con:
chmod +x respaldar_mysqldump.sh
Hora de probar con:
./respaldar_mysqldump.sh
Y si no hay ningún error, significa que el respaldo fue creado bien. Todo ese proceso queda en esta imagen final:
Así es como terminamos. La segunda parte será sobre cómo agregarlo a cron para que sean respaldos periódicos.