mysqldump es la herramienta de backup más usada en MySQL. Genera un fichero SQL que contiene las instrucciones CREATE TABLE y los INSERT necesarios para recrear la base de datos completa. El resultado es un fichero de texto legible, portable y fácilmente restaurable en cualquier instancia MySQL.
En este capítulo cubrimos las opciones más importantes de mysqldump, cómo comprimir y restaurar backups, y cómo automatizar el proceso con cron.
Backup básico con mysqldump
# Hacer backup de una base de datos completa mysqldump -u root -p tienda > tienda_backup.sql # Backup con timestamp en el nombre del fichero mysqldump -u root -p tienda > "tienda_$(date +%Y%m%d_%H%M%S).sql" # Backup de varias bases de datos mysqldump -u root -p --databases tienda blog crm > multi_backup.sql # Backup de todas las bases de datos mysqldump -u root -p --all-databases > all_databases.sql
Opciones importantes
# --single-transaction: backup consistente sin bloquear la BD (InnoDB) # Es la opción más importante para producción; evita bloquear lecturas y escrituras mysqldump -u root -p --single-transaction tienda > tienda_backup.sql # --no-tablespaces: necesario con MySQL 8+ si el usuario no tiene FILE privilege mysqldump -u appuser -p --single-transaction --no-tablespaces tienda > backup.sql # --routines: incluir procedimientos almacenados y funciones # --events: incluir eventos programados del servidor mysqldump -u root -p --single-transaction --routines --events tienda > backup_completo.sql # --no-data: solo la estructura (sin los datos) — útil para migrar esquemas mysqldump -u root -p --no-data tienda > esquema.sql # --where: solo un subconjunto de datos mysqldump -u root -p tienda pedidos --where="fecha >= '2026-01-01'" > pedidos_2026.sql
Comprimir el backup
# Comprimir con gzip directamente (sin fichero intermedio) mysqldump -u root -p --single-transaction tienda | gzip > "tienda_$(date +%Y%m%d).sql.gz" # Descomprimir y restaurar en un solo comando gunzip < tienda_20260509.sql.gz | mysql -u root -p tienda
Restaurar un backup
# Restaurar en una base de datos existente mysql -u root -p tienda < tienda_backup.sql # Crear la base de datos primero (si no existe) mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS tienda CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" mysql -u root -p tienda < tienda_backup.sql # Verificar que la restauración fue correcta mysql -u root -p tienda -e "SHOW TABLES;" mysql -u root -p tienda -e "SELECT COUNT(*) FROM clientes;"
Backup automático con cron
# Crear un fichero de credenciales (~/.my.cnf) para no escribir la contraseña en cron # chmod 600 ~/.my.cnf # Contenido: # [mysqldump] # user=backupuser # password=contraseña_segura # Añadir tarea cron: backup diario a las 3:00 AM con retención de 30 días crontab -e # 0 3 * * * mysqldump --single-transaction --no-tablespaces tienda | gzip > /backups/tienda_$(date +\%Y\%m\%d).sql.gz && find /backups -name "tienda_*.sql.gz" -mtime +30 -delete
mysqlpump y MySQL Shell (alternativas modernas)
# mysqlpump: versión paralela de mysqldump (más rápida para BD grandes) mysqlpump --single-transaction --default-parallelism=4 tienda > backup.sql # MySQL Shell (mysqlsh): backup con compresión nativa, progreso y cifrado mysqlsh root@localhost -- util dumpSchemas tienda --outputUrl=/backups/tienda --compression=zstd
