MySQL: backup y restauración desde la línea de comandos

Requisitos

  • Tener acceso a un terminal Unix/Linux
  • Tener la contraseña del usuario root de MySQL, o la de otro usuario con acceso a la base de datos

Backup

Backup de una sola base de datos

Backup a un archivo de texto plano con los comandos SQL para recrear las tablas y sus datos:

mysqldump -u [usuario] -p [nombre_base_de_datos] > [archivo].sql

Backup comprimido con gzip:

mysqldump -u [usuario] -p [nombre_base_de_datos] | gzip > [archivo].sql.gz

Backup comprimido con bzip2:

mysqldump -u [usuario] -p [nombre_base_de_datos] | bzip2 > [archivo].sql.bz2

La mayoría de instalaciones de PHPMyAdmin pueden importar archivos .gz y .bz2 directamente, así que la salida comprimida suele ser la mejor opción.

Usar --single-transaction con tablas InnoDB

Si tu base de datos usa InnoDB (el motor por defecto desde MySQL 5.5), añade siempre --single-transaction:

mysqldump -u [usuario] -p --single-transaction [nombre_base_de_datos] > [archivo].sql

Sin esta opción, mysqldump bloquea las tablas durante el volcado, lo que impide escrituras y puede producir una instantánea inconsistente si hay transacciones en curso. --single-transaction emite un BEGIN antes de volcar, obteniendo una instantánea consistente sin bloqueos. No tiene efecto en tablas MyISAM.

Backup de más de una base de datos

mysqldump -u [usuario] -p --databases [bd_1] [bd_2] [bd_n] > [archivo].sql

Backup de todas las bases de datos

mysqldump -u [usuario] -p --all-databases > [archivo].sql

Vuelca todas las bases de datos en un solo archivo. Muy útil para migrar un servidor MySQL completo.

Incluir rutinas almacenadas y eventos

Por defecto mysqldump no exporta procedimientos almacenados, funciones ni eventos programados. Añade estas opciones para un backup completo:

mysqldump -u [usuario] -p --single-transaction --routines --events [nombre_base_de_datos] > [archivo].sql

Restauración

Primero crea la base de datos de destino:

mysql -u [usuario] -p

En el prompt mysql>:

CREATE DATABASE [nombre_base_de_datos];

Opcionalmente, crea un usuario dedicado (recomendado):

CREATE USER '[nuevo_usuario]'@'[hostname]' IDENTIFIED BY '[contraseña]';
GRANT ALL PRIVILEGES ON [nombre_base_de_datos].* TO '[nuevo_usuario]'@'[hostname]';
FLUSH PRIVILEGES;
EXIT;

Nota MySQL 5.x: la sintaxis antigua GRANT ... IDENTIFIED BY funciona en MySQL 5.x pero está obsoleta en MySQL 8 y eliminada en versiones posteriores. Usa el método en dos pasos CREATE USER + GRANT mostrado arriba en MySQL 8+.

Restaurar desde el archivo dump

mysql -u [nuevo_usuario] -p [nombre_base_de_datos] < [archivo].sql

Si el archivo está comprimido, descomprímelo primero:

gunzip [archivo].sql.gz
bunzip2 [archivo].sql.bz2

O envíalo directamente por pipe sin crear un archivo intermedio:

gunzip -c [archivo].sql.gz | mysql -u [nuevo_usuario] -p [nombre_base_de_datos]

MariaDB

En MariaDB 10.4+ el comando preferido es mariadb-dump (un reemplazo directo de mysqldump):

mariadb-dump -u [usuario] -p --single-transaction [nombre_base_de_datos] > [archivo].sql

mysqldump sigue funcionando como alias, pero mariadb-dump es el nombre canónico de ahora en adelante.


Última actualización: 25 de junio de 2026