Dump de una tabla

En muchas situaciones no necesitas respaldar toda la base de datos, sino solo una o varias tablas específicas. Quizás quieres migrar una tabla de un servidor a otro, hacer una copia de seguridad antes de una operación arriesgada, o exportar datos para compartirlos con otro equipo. La herramienta mysqldump permite exportar tablas individuales de forma sencilla y precisa.

Exportar una tabla

Para exportar una tabla específica, pasa el nombre de la base de datos seguido del nombre de la tabla:

mysqldump -u root -p tienda_mysql productos > productos_backup.sql

El archivo resultante contiene la sentencia CREATE TABLE y todas las sentencias INSERT necesarias para recrear la tabla con sus datos:

DROP TABLE IF EXISTS `productos`;
CREATE TABLE `productos` (
  `id` int NOT NULL AUTO_INCREMENT,
  `nombre` varchar(200) NOT NULL,
  `precio` decimal(10,2) NOT NULL,
  `stock` int DEFAULT '0',
  `categoria_id` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_categoria` (`categoria_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
INSERT INTO `productos` VALUES
(1,'iPhone 15 Pro',1299.99,45,6),
(2,'Samsung Galaxy S24',899.99,62,6),
(3,'Google Pixel 8',699.00,38,6);

A diferencia del backup de una base de datos completa, el dump de una tabla no incluye CREATE DATABASE ni USE, ya que se asume que la base de datos destino ya existe.

Exportar múltiples tablas

Puedes especificar varias tablas separándolas con espacios:

mysqldump -u root -p tienda_mysql productos categorias > productos_categorias.sql

El archivo resultante contiene las sentencias para ambas tablas en orden. Esto es útil cuando las tablas tienen relaciones entre sí y quieres mantener la consistencia.

# Exportar las tablas relacionadas con pedidos
mysqldump --single-transaction -u root -p tienda_mysql \
    pedidos detalle_pedidos envios > pedidos_completos.sql

Exportar solo la estructura de una tabla

Si necesitas únicamente la definición de la tabla sin datos, usa --no-data:

mysqldump --no-data -u root -p tienda_mysql productos > productos_esquema.sql

El archivo contiene solo la sentencia CREATE TABLE con la definición completa de columnas, índices y restricciones. Esto es particularmente útil para crear tablas idénticas en otros entornos o para documentar la estructura.

Exportar solo los datos

Lo contrario: exportar los datos sin la estructura de la tabla:

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

El archivo contiene solo las sentencias INSERT. Esto se usa cuando la tabla destino ya existe con la misma estructura y solo necesitas cargar o actualizar los datos.

Exportar un subconjunto de filas con --where

La opción --where permite filtrar las filas exportadas con una condición SQL, como si añadieras una cláusula WHERE a la consulta de extracción:

# Exportar solo productos de una categoría específica
mysqldump -u root -p tienda_mysql productos --where="categoria_id = 6" > productos_smartphones.sql

La condición se aplica directamente en la consulta que mysqldump ejecuta internamente. Puedes usar cualquier expresión válida en un WHERE:

# Exportar pedidos del último mes
mysqldump --single-transaction -u root -p tienda_mysql pedidos \
    --where="fecha_pedido >= '2026-01-01'" > pedidos_enero.sql
 
# Exportar los 1000 productos más vendidos
mysqldump -u root -p tienda_mysql productos \
    --where="id IN (SELECT producto_id FROM detalle_pedidos GROUP BY producto_id ORDER BY SUM(cantidad) DESC LIMIT 1000)" \
    > productos_mas_vendidos.sql
 
# Exportar clientes de una región
mysqldump -u root -p tienda_mysql clientes \
    --where="ciudad IN ('Madrid', 'Barcelona', 'Valencia')" > clientes_levante.sql

La opción --where es extremadamente útil para tablas grandes cuando solo necesitas un subconjunto de datos.

Tablas grandes: consideraciones de rendimiento

Cuando la tabla tiene millones de filas, el archivo de dump puede ser muy grande y tanto la exportación como la restauración pueden tardar considerablemente.

La compresión reduce el tamaño del archivo de forma drástica:

# Comprimir la salida directamente
mysqldump --single-transaction -u root -p tienda_mysql detalle_pedidos \
    | gzip > detalle_pedidos.sql.gz

Para tablas InnoDB, usa siempre --single-transaction para evitar bloqueos:

mysqldump --single-transaction --quick -u root -p tienda_mysql log_actividad > log_actividad.sql

La opción --quick (activada por defecto con --opt) lee las filas una por una desde el servidor en lugar de cargarlas todas en memoria, lo que es esencial para tablas muy grandes.

Exportar una tabla con sus dependencias

Si la tabla tiene foreign keys que apuntan a otras tablas, el dump de la tabla individual no incluye las tablas referenciadas. Al restaurar, puedes encontrar errores si las tablas referenciadas no existen.

Una solución es desactivar temporalmente la verificación de foreign keys durante la restauración. mysqldump incluye automáticamente estas sentencias cuando usas --opt (activado por defecto):

-- Estas líneas aparecen en el archivo de dump
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
 
-- ... sentencias CREATE TABLE e INSERT ...
 
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

La otra opción es exportar la tabla junto con todas sus dependencias:

# Exportar productos con su tabla de categorías referenciada
mysqldump --single-transaction -u root -p tienda_mysql categorias productos > productos_con_categorias.sql

Exportar una tabla a otro servidor

Puedes combinar mysqldump con mysql en un pipe para transferir una tabla directamente entre servidores sin crear un archivo intermedio:

# Transferir tabla directamente entre servidores
mysqldump --single-transaction -u root -p tienda_mysql productos \
    | mysql -h servidor_destino -u admin -p tienda_mysql

Si los servidores están en redes diferentes, puedes usar SSH como túnel:

# Transferir a través de SSH
mysqldump --single-transaction -u root -p tienda_mysql productos \
    | ssh usuario@servidor_destino "mysql -u admin -p tienda_mysql"

Dump con formato de sentencias INSERT completas

Por defecto, mysqldump genera sentencias INSERT extendidas que agrupan varias filas. Si necesitas sentencias individuales (una por fila), usa --skip-extended-insert:

mysqldump --skip-extended-insert -u root -p tienda_mysql productos > productos_filas_individuales.sql
-- Con --skip-extended-insert: una sentencia por fila
INSERT INTO `productos` VALUES (1,'iPhone 15 Pro',1299.99,45,6);
INSERT INTO `productos` VALUES (2,'Samsung Galaxy S24',899.99,62,6);
INSERT INTO `productos` VALUES (3,'Google Pixel 8',699.00,38,6);

Esto genera un archivo más grande y la restauración es más lenta, pero el archivo es más legible y más fácil de editar manualmente si necesitas modificar datos específicos.

Incluir nombres de columna en los INSERT

La opción --complete-insert genera sentencias INSERT que incluyen los nombres de las columnas:

mysqldump --complete-insert -u root -p tienda_mysql productos > productos_completo.sql
INSERT INTO `productos` (`id`,`nombre`,`precio`,`stock`,`categoria_id`)
VALUES (1,'iPhone 15 Pro',1299.99,45,6);

Esto es especialmente útil si la tabla destino tiene las columnas en un orden diferente o si se han añadido nuevas columnas desde que se creó el dump.

Restaurar una tabla desde el dump

La restauración de una tabla individual se hace con el cliente mysql:

# Restaurar en la misma base de datos
mysql -u root -p tienda_mysql < productos_backup.sql
 
# Restaurar desde archivo comprimido
zcat productos.sql.gz | mysql -u root -p tienda_mysql

Si la tabla ya existe, la sentencia DROP TABLE IF EXISTS incluida en el dump la eliminará antes de recrearla. Ten cuidado: esto destruye todos los datos actuales de la tabla.

El dump de tablas individuales es una herramienta precisa para cuando necesitas trabajar con partes específicas de tu base de datos. En el siguiente artículo veremos cómo restaurar backups completos, incluyendo técnicas para manejar errores y monitorear el progreso.

Escrito por Eduardo Lázaro