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 TABLESyEVENTsobre 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.
Bashmysqldump -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.
Bashmysqldump -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.
Bashmysqldump -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
Bashchmod 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.
Bashmysql -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.
Bashapt 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.
Bashmysqldump --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
Bashgzip -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:
Bashsed -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.