¿Qué es un archivo SQL dump?
Un SQL dump es un archivo de texto plano que contiene una secuencia de sentencias SQL que, cuando se ejecutan contra un servidor de base de datos, recrean completamente la estructura y los datos de una base de datos. El término "dump" proviene de la tradición Unix de "volcar" el estado de la memoria o los datos a un archivo para su preservación o transferencia.
Los archivos SQL dump son el formato universal para copias de seguridad de bases de datos, migración, compartición de datos de desarrollo y sembrado de bases de datos de producción. Son legibles por cualquier editor de texto, comparables en control de versiones y ejecutables por cualquier cliente de base de datos compatible.
Extensiones de archivos SQL dump
| Extensión | Sistema asociado |
|---|---|
.sql |
El más común — MySQL, MariaDB, PostgreSQL, SQLite |
.dump |
Dumps personalizados de PostgreSQL (también .dmp) |
.bak |
Copias de seguridad de Microsoft SQL Server |
.dmp |
Exportaciones de Oracle Database |
Qué contiene típicamente un SQL dump
-- Eliminar y recrear tablas de forma segura
DROP TABLE IF EXISTS `usuarios`;
-- Estructura de la tabla
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`nombre` varchar(255) DEFAULT NULL,
`creado_en` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Filas de datos
INSERT INTO `usuarios` (`id`, `email`, `nombre`, `creado_en`) VALUES
(1, 'alice@ejemplo.com', 'Alice Smith', '2024-01-15 09:23:00'),
(2, 'bob@ejemplo.com', 'Bob Jones', '2024-01-16 14:05:00');
-- Índices (a veces separados del CREATE TABLE)
CREATE INDEX idx_usuarios_nombre ON usuarios(nombre);
Un dump completo típicamente incluye:
- Sentencias
SETpara configuración de charset y modo SQL DROP TABLE IF EXISTSpara reimportación segura (idempotente)- Sentencias
CREATE TABLEcon el esquema completo - Sentencias
INSERT INTOcon todas las filas de datos - Sentencias
CREATE INDEXyCREATE VIEW - Sentencias
GRANTpara permisos de base de datos (en dumps completos del servidor) - Cambios de
DELIMITERpara procedimientos almacenados y disparadores
Por qué se usan los SQL dumps
- Migración de base de datos — mover una base de datos de un servidor a otro
- Copia de seguridad y restauración — crear instantáneas en un momento específico para recuperación ante desastres
- Compartición en desarrollo — compartir el estado de una base de datos con miembros del equipo
- Despliegue — sembrar bases de datos de producción con datos iniciales
- Instantáneas de desarrollo — capturar un estado conocido y funcional para poder revertir
- Control de versiones — seguimiento de cambios de esquema junto al código de la aplicación
Dumps de MySQL / MariaDB
Crear dumps (exportar)
# Exportar una sola base de datos
mysqldump -u usuario -p nombre_base_datos > backup.sql
# Exportar todas las bases de datos del servidor
mysqldump -u usuario -p --all-databases > todas_las_bd.sql
# Exportar solo tablas específicas
mysqldump -u usuario -p nombre_base_datos tabla1 tabla2 > tablas.sql
# Exportar solo el esquema (sin datos)
mysqldump -u usuario -p --no-data nombre_base_datos > esquema.sql
# Exportar solo datos (sin CREATE TABLE)
mysqldump -u usuario -p --no-create-info nombre_base_datos > datos.sql
# Exportar comprimido (ahorra espacio para bases de datos grandes)
mysqldump -u usuario -p nombre_base_datos | gzip > backup.sql.gz
Restaurar dumps (importar)
# Restaurar un dump en una base de datos existente
mysql -u usuario -p nombre_base_datos < backup.sql
# Crear base de datos primero, luego restaurar
mysql -u usuario -p -e "CREATE DATABASE mibd CHARACTER SET utf8mb4;"
mysql -u usuario -p mibd < backup.sql
# Restaurar dump comprimido
gunzip < backup.sql.gz | mysql -u usuario -p nombre_base_datos
Dumps de PostgreSQL
Crear dumps (exportar)
# Formato SQL plano (portable, legible)
pg_dump -U usuario nombre_base_datos > backup.sql
# Formato binario personalizado (más rápido, soporta restauración paralela)
pg_dump -U usuario -F c nombre_base_datos > backup.dump
# Formato directorio (dump paralelo para bases de datos grandes)
pg_dump -U usuario -F d -j 4 nombre_base_datos -f dir_backup/
# Solo esquema
pg_dump -U usuario --schema-only nombre_base_datos > esquema.sql
# Dump de todas las bases de datos incluyendo roles y tablespaces
pg_dumpall -U postgres > todo_postgres.sql
Restaurar dumps (importar)
# Restaurar dump SQL plano
psql -U usuario nombre_base_datos < backup.sql
# Restaurar dump en formato personalizado (soporta restauración paralela)
pg_restore -U usuario -d nombre_base_datos backup.dump
# Restauración paralela (más rápida para bases de datos grandes)
pg_restore -U usuario -d nombre_base_datos -j 4 backup.dump
Dumps de SQLite
# Exportar
sqlite3 base_datos.db .dump > backup.sql
# Exportar solo una tabla específica
sqlite3 base_datos.db ".dump nombre_tabla" > tabla.sql
# Importar (crear nueva base de datos desde dump)
sqlite3 nueva_base_datos.db < backup.sql
# Importar en base de datos existente
sqlite3 existente.db < backup.sql
Guía de la estructura de un SQL dump
Aquí hay un dump pequeño y realista con cada sección explicada:
-- (1) Configuración del servidor — establece el charset correcto para restauración fiable
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0; -- Deshabilitar comprobaciones FK durante la importación
-- (2) Definición de la tabla — recrea el esquema
DROP TABLE IF EXISTS `pedidos`;
CREATE TABLE `pedidos` (
`id` int NOT NULL AUTO_INCREMENT,
`usuario_id` int NOT NULL,
`total` decimal(10,2) NOT NULL,
`estado` enum('pendiente','pagado','enviado') DEFAULT 'pendiente',
`creado_en` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `fk_usuario` (`usuario_id`),
CONSTRAINT `fk_usuario` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios` (`id`)
) ENGINE=InnoDB;
-- (3) Filas de datos — insertadas en lotes para mayor eficiencia
INSERT INTO `pedidos` (`id`, `usuario_id`, `total`, `estado`) VALUES
(1, 1, 99.99, 'pagado'),
(2, 1, 149.50, 'enviado'),
(3, 2, 29.99, 'pendiente');
-- (4) Rehabilitar comprobaciones FK después de cargar todos los datos
SET FOREIGN_KEY_CHECKS = 1;
Convertir SQL dump a CSV
Opción 1: Restaurar y luego exportar (el método más limpio)
- Restaura el dump SQL en una base de datos local:
mysql -u root -p mibd < backup.sql - Abre la base de datos en una GUI (DBeaver, TablePlus, MySQL Workbench, DataGrip)
- Clic derecho en la tabla → Exportar → CSV
Opción 2: Extracción por línea de comandos
# Exportar tabla específica como CSV mediante el cliente mysql
mysql -u root -p -e "SELECT * FROM pedidos" mibd | sed 's/\t/,/g' > pedidos.csv
# mysqldump --tab exporta cada tabla como esquema + datos TSV por separado
mysqldump --tab=/tmp/ -u root -p mibd nombre_tabla
# Crea: /tmp/nombre_tabla.sql (esquema) + /tmp/nombre_tabla.txt (datos TSV)
Opción 3: Análisis con Python (para casos simples)
import re, csv
with open('backup.sql', 'r') as f:
content = f.read()
# Extraer valores INSERT para una tabla específica
pattern = r"INSERT INTO `pedidos`[^;]+VALUES\s*(.+?);"
matches = re.findall(pattern, content, re.DOTALL)
# Analizar valores manualmente o usar una librería de análisis SQL adecuada
Flujo de trabajo de SQL dump a Excel
El camino recomendado: restaurar → exportar desde GUI
- Restaura el dump en MySQL/PostgreSQL local
- Conéctate con DBeaver (gratuito), TablePlus o MySQL Workbench
- Clic derecho en la tabla → Exportar datos → elige Excel (.xlsx) o CSV
- Abre en Excel/LibreOffice Calc
Manejo de dumps grandes
# Dividir un dump grande en trozos de 100.000 líneas para procesarlo
split -l 100000 backup.sql parte_
# Extraer solo las filas de una tabla específica
grep "INSERT INTO \`pedidos\`" backup.sql > datos_pedidos.sql
# Contar filas en el dump (aproximado)
grep -c "^INSERT INTO" backup.sql
# Monitorizar el progreso de la importación con pv (pipe viewer)
pv backup.sql | mysql -u root -p nombre_base_datos
Problemas comunes y soluciones
Problemas de charset/codificación
# Forzar UTF-8 durante la importación
mysql -u root -p --default-character-set=utf8mb4 mibd < backup.sql
Incompatibilidad de versiones de MySQL
Los dumps de MySQL 8.0 usan una sintaxis más nueva (p. ej., la intercalación utf8mb4_0900_ai_ci) que MySQL 5.7 no entiende. Solución: busca y reemplaza el nombre de la intercalación en el archivo dump, o usa el flag --compatible al crear el dump:
mysqldump --compatible=mysql57 -u root -p mibd > backup.sql
Errores de restricción de clave foránea
-- Añade esto al INICIO del archivo dump (antes de cualquier INSERT):
SET FOREIGN_KEY_CHECKS=0;
-- Añade esto al FINAL (después de todos los INSERT):
SET FOREIGN_KEY_CHECKS=1;
Datos binarios (columnas BLOB)
Los datos binarios se almacenan como literales hexadecimales en los dumps de MySQL (0x89504E47...). Este es el comportamiento correcto — los datos binarios se preservan sin pérdida. No se requiere ninguna acción a menos que necesites inspeccionar el contenido binario real.
Convertir archivos SQL
- SQL a CSV — extraer datos de tablas como valores separados por comas para Excel/Sheets
- SQL a JSON — convertir filas de tablas a arrays JSON para APIs
- SQL a Excel — restaurar y exportar mediante GUI de base de datos
- MySQL a PostgreSQL — conversión de dialecto (diferente sintaxis para tipos, AUTO_INCREMENT vs SERIAL, etc.)
Utiliza KaijuConverter para convertir exportaciones de bases de datos y archivos de datos estructurados al instante.
Conversiones relacionadas
Conversiones frecuentes del catálogo: