mysqldump

La herramienta mysqldump es la forma estándar de crear backups lógicos en MySQL. Genera un archivo de texto que contiene sentencias SQL capaces de recrear completamente la estructura y los datos de las bases de datos respaldadas. Viene incluida con toda instalación de MySQL y es compatible con todas las versiones, lo que la convierte en la opción más universal y portable para respaldos.

Sintaxis básica

mysqldump [opciones] nombre_base_de_datos [tabla1 tabla2 ...] > archivo.sql

El comando se ejecuta desde la línea de comandos del sistema operativo, no desde el cliente mysql. La salida se redirige a un archivo con el operador >. Sin redirección, el contenido se imprime en la terminal.

# Backup de una base de datos completa
mysqldump -u root -p tienda_mysql > tienda_mysql_backup.sql

MySQL pedirá la contraseña de forma interactiva. El archivo resultante contiene todas las sentencias CREATE TABLE, INSERT y demás instrucciones necesarias para recrear la base de datos.

Formato de salida

El archivo generado por mysqldump tiene una estructura bien definida. Primero incluye comentarios con información del servidor, luego las sentencias para cada tabla en orden:

-- MySQL dump 10.13  Distrib 8.4.0, for Linux (x86_64)
-- Host: localhost    Database: tienda_mysql
-- Server version   8.4.0
 
--
-- Table structure for table `categorias`
--
 
DROP TABLE IF EXISTS `categorias`;
CREATE TABLE `categorias` (
  `id` int NOT NULL AUTO_INCREMENT,
  `nombre` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
--
-- Dumping data for table `categorias`
--
 
INSERT INTO `categorias` VALUES (1,'Electrónica'),(2,'Ropa'),(3,'Hogar');

Observa que por defecto incluye DROP TABLE IF EXISTS antes de cada CREATE TABLE, lo que facilita la restauración repetida sin errores de tablas duplicadas.

Opciones esenciales

--single-transaction

Para tablas InnoDB, esta opción es fundamental. Crea una instantánea consistente de los datos usando una transacción con nivel de aislamiento REPEATABLE READ. Esto significa que el backup refleja el estado exacto de la base de datos en un momento específico, sin bloquear las tablas:

mysqldump --single-transaction -u root -p tienda_mysql > backup.sql

Sin esta opción, mysqldump bloquea las tablas durante el respaldo, lo que impide que otras conexiones escriban datos. Con --single-transaction, las operaciones de lectura y escritura pueden continuar normalmente.

--routines y --triggers

Por defecto, mysqldump no incluye procedimientos almacenados ni funciones. Para incluirlos necesitas --routines. Los triggers sí se incluyen por defecto, pero es buena práctica especificarlo explícitamente:

mysqldump --single-transaction --routines --triggers -u root -p tienda_mysql > backup.sql

--events

Si utilizas el scheduler de eventos de MySQL, la opción --events incluye los eventos programados en el respaldo:

mysqldump --single-transaction --routines --triggers --events -u root -p tienda_mysql > backup.sql

--add-drop-database y --add-drop-table

La opción --add-drop-table está activada por defecto e incluye sentencias DROP TABLE IF EXISTS antes de cada CREATE TABLE. La opción --add-drop-database añade además DROP DATABASE IF EXISTS antes de CREATE DATABASE, lo que es útil cuando quieres asegurarte de que la restauración parte de un estado limpio:

mysqldump --add-drop-database --databases tienda_mysql -u root -p > backup.sql

--no-data

Si solo necesitas la estructura de las tablas sin los datos, usa --no-data:

mysqldump --no-data -u root -p tienda_mysql > esquema.sql

Esto genera un archivo con solo las sentencias CREATE TABLE, índices, vistas y demás objetos DDL. Es útil para replicar la estructura en otro servidor o para control de versiones del esquema.

--no-create-info

Lo contrario: exporta solo los datos sin las sentencias de creación de tablas:

mysqldump --no-create-info -u root -p tienda_mysql > datos.sql

Compresión

Los archivos de mysqldump son texto plano y se comprimen muy bien. Usar compresión directa en el pipe ahorra espacio en disco significativamente:

# Comprimir con gzip (compresión estándar)
mysqldump --single-transaction -u root -p tienda_mysql | gzip > backup.sql.gz
 
# Comprimir con pigz (gzip paralelo, más rápido)
mysqldump --single-transaction -u root -p tienda_mysql | pigz > backup.sql.gz
 
# Comprimir con zstd (mejor ratio de compresión)
mysqldump --single-transaction -u root -p tienda_mysql | zstd > backup.sql.zst

La compresión típica reduce el tamaño del archivo entre un 70% y un 90%. Un backup de 10 GB sin comprimir puede quedar en 1-2 GB comprimido.

Opciones de rendimiento

--quick

Esta opción hace que mysqldump lea las filas una por una desde el servidor en lugar de cargar la tabla completa en memoria. Está activada por defecto y es esencial para tablas grandes.

--opt

La opción --opt activa un conjunto de opciones que mejoran el rendimiento tanto de la creación como de la restauración del backup. Está activada por defecto e incluye --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables y --quick.

--extended-insert

Esta opción (activada por defecto con --opt) agrupa múltiples filas en una sola sentencia INSERT, lo que acelera significativamente la restauración:

-- Con --extended-insert (por defecto)
INSERT INTO productos VALUES (1,'iPhone',1299.99),(2,'Samsung',899.99),(3,'Pixel',699.00);
 
-- Sin --extended-insert (--skip-extended-insert)
INSERT INTO productos VALUES (1,'iPhone',1299.99);
INSERT INTO productos VALUES (2,'Samsung',899.99);
INSERT INTO productos VALUES (3,'Pixel',699.00);

La versión con inserciones extendidas es mucho más rápida de restaurar porque reduce el overhead de parsear y ejecutar sentencias individuales.

Comando completo recomendado

Para un backup de producción completo, esta combinación de opciones cubre la mayoría de los escenarios:

mysqldump \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    --set-gtid-purged=OFF \
    -u root -p \
    tienda_mysql | gzip > /backups/tienda_mysql_$(date +%Y%m%d_%H%M%S).sql.gz

La opción --set-gtid-purged=OFF evita advertencias relacionadas con GTIDs si no estás configurando replicación.

Verificar el backup

Después de crear un backup, es buena práctica verificar que el archivo no está vacío y tiene un formato válido:

# Verificar tamaño del archivo
ls -lh /backups/tienda_mysql_20260214_030000.sql.gz
 
# Verificar que el archivo comprimido es válido
gzip -t /backups/tienda_mysql_20260214_030000.sql.gz
 
# Ver las primeras líneas para confirmar el formato
zcat /backups/tienda_mysql_20260214_030000.sql.gz | head -20

Limitaciones de mysqldump

Aunque mysqldump es extremadamente versátil, tiene limitaciones. Para bases de datos muy grandes (centenares de GB o TB), el proceso de creación y especialmente la restauración pueden tardar horas o incluso días. En estos casos, herramientas de backup físico como Percona XtraBackup son más apropiadas.

Además, mysqldump genera un backup en un solo hilo, lo que limita la velocidad en servidores con múltiples CPUs y discos rápidos. Si la velocidad de backup es crítica, considera mysqlpump (que soporta paralelismo) o mydumper (herramienta de terceros con exportación paralela).

A pesar de estas limitaciones, mysqldump sigue siendo la herramienta más utilizada y la primera opción para la mayoría de las bases de datos MySQL. En los siguientes artículos veremos cómo aplicarlo a diferentes escenarios: backup de una base de datos específica, de todas las bases, y de tablas individuales.

Escrito por Eduardo Lázaro