Exportar e importar una base MySQL/MariaDB en un VPS Linux

3 min
Hosting VPS/VDS

Migrar un sitio web, restaurar una copia de seguridad o clonar un entorno de pruebas se reduce siempre a dos operaciones: volcar la base de datos a un archivo y volver a cargarla. En un VPS Linux Infrawire ambas se hacen con unos pocos comandos, sin interfaz web. Esta guía cubre volcados consistentes, compresión, archivos grandes, codificación de caracteres y transferencia directa entre servidores.

📋 Requisitos previos

  • Un VPS Linux con Ubuntu 24.04 o Debian 12 y acceso SSH como root (la IP y la contraseña root están en tu área de cliente)
  • MySQL o MariaDB instalado, o al menos el cliente (apt install mariadb-client)
  • Un usuario de base de datos con los privilegios SELECT, SHOW VIEW, TRIGGER, LOCK TABLES y EVENT sobre la base que se va a volcar
  • Suficiente espacio libre en disco: compruébalo con df -h

1. Exportar una base con mysqldump

Para tablas InnoDB (el motor por defecto), --single-transaction genera una instantánea consistente sin bloquear las tablas, de modo que tu sitio sigue funcionando durante el volcado.

Bash
mysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql

En las versiones recientes de MariaDB la herramienta también existe como mariadb-dump, con las mismas opciones.

2. Incluir rutinas, triggers y eventos

Los triggers se vuelcan por defecto, pero los procedimientos almacenados, las funciones y los eventos programados hay que pedirlos de forma explícita. Fijar el juego de caracteres evita sorpresas con tildes y emojis.

Bash
mysqldump -u USER -p --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 DBNAME > DBNAME.sql

Variantes útiles:

Bash
# Solo la estructura, sin filas mysqldump -u USER -p --no-data DBNAME > schema.sql # Varias bases, con sentencias CREATE DATABASE mysqldump -u USER -p --single-transaction --databases DB1 DB2 > two-dbs.sql # Todas las bases del servidor mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql

3. Comprimir el volcado con gzip

El texto SQL se comprime muy bien. Envía la salida directamente a gzip para que el archivo sin comprimir nunca llegue al disco.

Bash
mysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz

Para no escribir la contraseña cada vez (y evitar que aparezca en la salida de ps), guárdala en ~/.my.cnf:

INI
[client] user=USER password=YOUR_PASSWORD
Bash
chmod 600 ~/.my.cnf

4. Importar un volcado

Crea primero la base de destino con un juego de caracteres moderno y después carga el archivo.

Bash
mysql -u USER -p -e 'CREATE DATABASE IF NOT EXISTS DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' mysql -u USER -p --default-character-set=utf8mb4 DBNAME < DBNAME.sql # Desde un archivo comprimido gunzip -c DBNAME.sql.gz | mysql -u USER -p --default-character-set=utf8mb4 DBNAME

Atención: por defecto el volcado incluye DROP TABLE IF EXISTS, así que al importar en una base existente se reemplazan las tablas con el mismo nombre. Haz antes una copia del destino.

5. Manejar archivos grandes

Para volcados de varios gigabytes, lanza la importación dentro de tmux para que una desconexión SSH no la interrumpa, y usa pv para ver el progreso.

Bash
apt install -y tmux pv tmux new -s import pv DBNAME.sql.gz | gunzip | mysql -u USER -p --max-allowed-packet=512M DBNAME

Sepárate con Ctrl+B y luego D, y vuelve más tarde con tmux attach -t import.

6. Transferir directamente a otro servidor por SSH

No hace falta ningún archivo intermedio: el volcado viaja por una tubería SSH cifrada y se carga al llegar. Las credenciales se leen de ~/.my.cnf (o del socket local como root) en cada extremo.

Bash
mysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'

La base DBNAME debe existir ya en el servidor de destino.

✅ Verificar el resultado

Bash
gzip -t DBNAME.sql.gz && echo 'archive OK' mysql -e 'SHOW TABLES;' DBNAME mysql -e 'SELECT COUNT(*) FROM TABLENAME;' DBNAME mysql -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name='DBNAME';"

Compara el número de filas de algunas tablas clave entre origen y destino.

🔧 Solución de problemas

ERROR 1045 Access denied : usuario o contraseña incorrectos, o el usuario no tiene permiso desde este host. Prueba primero con mysql -u USER -p.

ERROR 2006 MySQL server has gone away : una fila o consulta supera max_allowed_packet. Auméntalo en el servidor, en la sección [mysqld] de la configuración, y reinicia el servicio, o pasa --max-allowed-packet=512M al cliente.

Tildes ilegibles tras la importación : el archivo se leyó con un juego de caracteres incorrecto. Exporta con --default-character-set=utf8mb4 e importa con la misma opción.

ERROR 1227 o errores de DEFINER : el volcado hace referencia a un usuario que no existe en el destino. Elimina la cláusula durante la importación:

Bash
sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME

🎉 Ahora tus bases de datos son fáciles de respaldar, restaurar y migrar entre servidores.

Mantente al día con las últimas ofertas, descuentos y promociones especiales.

Ver promociones

Utilizamos cookies

Utilizamos cookies analíticas para mejorar su experiencia en nuestro sitio. No vendemos datos a terceros. Más información en nuestra política de privacidad.