Restaurar un dump

Crear backups es solo la mitad del trabajo. La otra mitad, igualmente crítica, es saber restaurarlos correctamente. La restauración de un backup de mysqldump consiste en ejecutar el archivo SQL generado contra el servidor MySQL, lo que recrea las tablas e inserta todos los datos. Aunque el concepto es simple, hay técnicas y precauciones que marcan la diferencia entre una restauración exitosa y un desastre mayor.

Restauración básica

La forma más directa de restaurar un backup es redirigir el archivo SQL al cliente mysql:

mysql -u root -p tienda_mysql < tienda_mysql_backup.sql

Este comando lee el archivo tienda_mysql_backup.sql línea por línea y ejecuta cada sentencia SQL contra la base de datos tienda_mysql. La base de datos debe existir previamente a menos que el archivo incluya la sentencia CREATE DATABASE.

Crear la base de datos antes de restaurar

Si el backup se creó sin la opción --databases, el archivo no contiene CREATE DATABASE. Necesitas crear la base de datos manualmente:

# Crear la base de datos
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS tienda_mysql CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
 
# Restaurar
mysql -u root -p tienda_mysql < tienda_mysql_backup.sql

Si el backup se creó con --databases o --all-databases, las sentencias CREATE DATABASE y USE están incluidas, y puedes restaurar sin especificar una base de datos:

# El archivo ya incluye CREATE DATABASE y USE
mysql -u root -p < servidor_completo.sql

Restaurar desde archivos comprimidos

Si el backup está comprimido con gzip, descomprímelo al vuelo con un pipe:

# gzip
zcat /backups/tienda_mysql_20260214.sql.gz | mysql -u root -p tienda_mysql
 
# También funciona con gunzip -c
gunzip -c /backups/tienda_mysql_20260214.sql.gz | mysql -u root -p tienda_mysql
 
# zstd
zstd -dc /backups/tienda_mysql_20260214.sql.zst | mysql -u root -p tienda_mysql

El uso de pipes evita tener que descomprimir el archivo completo en disco, lo que ahorra espacio cuando el backup descomprimido es muy grande.

Usar el comando SOURCE

Desde el cliente interactivo de mysql, puedes usar el comando SOURCE para ejecutar un archivo SQL:

mysql -u root -p
-- Dentro del cliente mysql
USE tienda_mysql;
SOURCE /backups/tienda_mysql_backup.sql;

La ventaja de SOURCE es que puedes ver los mensajes de error en tiempo real dentro de la sesión interactiva. Sin embargo, no funciona con archivos comprimidos y la ruta debe ser accesible desde el servidor donde ejecutas el cliente.

Acelerar la restauración

La restauración de un backup grande puede tardar mucho tiempo. Hay varias técnicas para acelerarla significativamente.

Desactivar las verificaciones de foreign keys y los índices únicos reduce el overhead durante las inserciones masivas. Aunque mysqldump incluye estas optimizaciones por defecto cuando usa --opt, puedes asegurarte manualmente:

mysql -u root -p tienda_mysql -e "
SET GLOBAL foreign_key_checks = 0;
SET GLOBAL unique_checks = 0;
SOURCE /backups/tienda_mysql_backup.sql;
SET GLOBAL foreign_key_checks = 1;
SET GLOBAL unique_checks = 1;
"

Aumentar temporalmente el buffer de InnoDB puede acelerar las inserciones:

-- Antes de restaurar, aumentar el log de transacciones
SET GLOBAL innodb_log_buffer_size = 256 * 1024 * 1024;

Desactivar el binary log durante la restauración evita registrar cada sentencia INSERT en los logs binarios, lo que puede duplicar el tiempo de restauración:

mysql -u root -p --init-command="SET sql_log_bin=0" tienda_mysql < backup.sql

Monitorear el progreso

Para backups grandes, es frustrante no saber cuánto falta. La herramienta pv (pipe viewer) muestra el progreso de la restauración:

# Instalar pv
sudo apt install pv
 
# Restaurar con indicador de progreso
pv /backups/tienda_mysql_backup.sql | mysql -u root -p tienda_mysql
2.35GiB 0:12:45 [3.15MiB/s] [=========>                    ] 35% ETA 0:23:42

Con archivos comprimidos, pv muestra el progreso basándose en el tamaño comprimido:

pv /backups/tienda_mysql_20260214.sql.gz | zcat | mysql -u root -p tienda_mysql

Otra opción es verificar el progreso monitoreando las tablas que se van creando:

-- En otra sesión, verificar qué tablas se han restaurado
SHOW TABLES FROM tienda_mysql;
 
-- Ver cuántas filas tiene la tabla que se está restaurando
SELECT COUNT(*) FROM tienda_mysql.pedidos;

Manejar errores durante la restauración

Si el archivo SQL contiene un error, el comportamiento por defecto del cliente mysql es mostrar el error y continuar con las siguientes sentencias. Esto puede dejar la base de datos en un estado parcialmente restaurado.

Para detener la restauración al primer error:

mysql --force=false -u root -p tienda_mysql < backup.sql

Para registrar los errores en un archivo sin detener la restauración:

mysql -u root -p tienda_mysql < backup.sql 2> errores_restauracion.log

Los errores más comunes durante la restauración incluyen tablas que ya existen (resuelto por DROP TABLE IF EXISTS que incluye mysqldump), bases de datos que no existen, y problemas de permisos o de espacio en disco.

Restaurar una tabla específica de un backup completo

Si tienes un backup de toda la base de datos pero solo necesitas restaurar una tabla específica, puedes extraer las sentencias relevantes:

# Extraer la tabla 'productos' del backup completo
sed -n '/^-- Table structure for table `productos`/,/^-- Table structure for table/p' \
    tienda_mysql_backup.sql > solo_productos.sql
 
# Restaurar solo esa tabla
mysql -u root -p tienda_mysql < solo_productos.sql

Esta técnica funciona pero es frágil. Es mucho más fiable hacer backups de tablas individuales por separado si anticipas esta necesidad.

Restaurar en un servidor diferente

Para restaurar un backup en otro servidor, simplemente apunta el cliente mysql al servidor destino:

# Restaurar en servidor remoto
mysql -h servidor_destino -u admin -p tienda_mysql < tienda_mysql_backup.sql
 
# Restaurar comprimido en servidor remoto
zcat /backups/tienda_mysql.sql.gz | mysql -h servidor_destino -u admin -p tienda_mysql

Asegúrate de que la versión de MySQL en el servidor destino sea compatible con el backup. Generalmente, puedes restaurar backups de versiones anteriores en versiones más recientes, pero no al revés.

Verificar la restauración

Después de restaurar, verifica que los datos están completos:

-- Contar filas en las tablas principales
SELECT 'productos' AS tabla, COUNT(*) AS filas FROM productos
UNION ALL
SELECT 'clientes', COUNT(*) FROM clientes
UNION ALL
SELECT 'pedidos', COUNT(*) FROM pedidos
UNION ALL
SELECT 'detalle_pedidos', COUNT(*) FROM detalle_pedidos;
tablafilas
productos150
clientes5230
pedidos28450
detalle_pedidos67320

Compara estos conteos con los del servidor original o con los registros de tu último backup para confirmar que la restauración fue completa.

-- Verificar que los procedimientos almacenados se restauraron
SELECT routine_type, routine_name
FROM information_schema.routines
WHERE routine_schema = 'tienda_mysql';
 
-- Verificar triggers
SELECT trigger_name, event_manipulation, event_object_table
FROM information_schema.triggers
WHERE trigger_schema = 'tienda_mysql';

Restauración paso a paso para entornos críticos

En entornos de producción, sigue un procedimiento metódico:

# 1. Verificar que el archivo de backup es válido
gzip -t /backups/tienda_mysql_20260214.sql.gz
 
# 2. Verificar espacio en disco disponible
df -h /var/lib/mysql
 
# 3. Crear la base de datos destino si es necesario
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS tienda_mysql_restore"
 
# 4. Restaurar en una base de datos temporal primero
zcat /backups/tienda_mysql_20260214.sql.gz | mysql -u root -p tienda_mysql_restore
 
# 5. Verificar la restauración
mysql -u root -p -e "SELECT COUNT(*) FROM tienda_mysql_restore.productos"
 
# 6. Si todo está correcto, renombrar las bases de datos
# (MySQL no tiene RENAME DATABASE, así que es necesario exportar e importar)

Restaurar primero en una base de datos temporal te da la oportunidad de verificar los datos antes de afectar el entorno de producción.

La restauración de backups es una habilidad que esperas no necesitar con urgencia, pero cuando la necesitas, la necesitas rápido. Practica el proceso regularmente para que cuando llegue el momento, la restauración sea un procedimiento familiar y no una improvisación bajo presión. En el siguiente artículo exploraremos la recuperación point-in-time, que permite restaurar datos hasta un momento exacto combinando backups con binary logs.

Escrito por Eduardo Lázaro