Importar una base MySQL o MariaDB grande por consola sin que se corte
En pocas palabras
Una base grande no se importa desde phpMyAdmin: el límite de subida y el tiempo máximo de PHP la cortan a mitad de camino. Subí el volcado comprimido al VPS con rsync -P, que retoma si se cae la conexión, creá la base vacía en utf8mb4 y cargala por consola dentro de tmux, por ejemplo con pv catalogo.sql.gz | zcat | mariadb catalogo, que además muestra el avance. Los tres errores más comunes son un max_allowed_packet chico, una intercalación de MySQL 8 que tu MariaDB no reconoce y los DEFINER de vistas y disparadores.
Por qué el navegador no es el camino
phpMyAdmin y Adminer reciben el archivo a través de PHP, así que heredan sus límites: el tamaño máximo de subida (upload_max_filesize y post_max_size) y el tiempo máximo de ejecución. El segundo es el peor, porque la importación arranca bien, carga la mitad de las tablas y se corta sin decir qué quedó adentro.
Por consola, el cliente de la base lee el archivo directo del disco y no tiene reloj. Lo que sí hay que cuidar es la sesión de SSH, el espacio libre y un par de ajustes del motor.
Tres comprobaciones antes de empezar
- Que el volcado esté entero.
mysqldumpescribe al final una línea conDump completed ony la fecha. Sizcat catalogo.sql.gz | tail -n 1no la muestra, el archivo quedó cortado en origen y no vale la pena subirlo. - Que haya espacio. Mirá
df -h /var/lib/mysql: la base ya importada, con sus índices, puede ocupar tanto como el volcado sin comprimir, o más. - Qué motor hay de cada lado:
mariadb --versionomysql --versionen el VPS, ySELECT VERSION();en el origen. Pasar de MySQL 8 a MariaDB se puede, con una incompatibilidad conocida que se resuelve más abajo.
| Distribución | MariaDB de los repositorios oficiales |
|---|---|
| Debian 12 | 10.11 |
| Debian 13 | 11.8 |
| Ubuntu 24.04 | 10.11 (también trae MySQL 8.0) |
| AlmaLinux 9 | 10.5 (también trae MySQL 8.0) |
| AlmaLinux 10 | 10.11 (también trae MySQL 8.4) |
En MariaDB reciente el cliente se llama mariadb; el nombre mysql sigue funcionando, a veces con un aviso de que va a desaparecer.
Llevar el archivo al VPS
Comprimido, un volcado ocupa entre cinco y diez veces menos, porque es texto. Para subirlo, rsync le gana a scp en algo importante: si la conexión se corta, retoma desde donde quedó en lugar de empezar de cero.
# comprimir, si todavía no lo está
gzip -9 catalogo.sql
# subirlo (si se corta, repetí el mismo comando)
rsync -P catalogo.sql.gz ana@203.0.113.50:/home/ana/
# con SSH en otro puerto
rsync -P -e "ssh -p 2222" catalogo.sql.gz ana@203.0.113.50:/home/ana/- Desde Windows, WinSCP o FileZilla hacen lo mismo por SFTP con tu usuario de SSH.
rsynctambién está disponible dentro de WSL. - Si la base sale de otro servidor al que entrás por SSH, podés exportar y enviar en un solo paso, sin archivo intermedio en el origen:
mysqldump --single-transaction --routines --events catalogo | gzip | ssh ana@203.0.113.50 "cat > catalogo.sql.gz". --single-transactionsaca una copia coherente de las tablas InnoDB sin bloquearlas;--routinesy--eventssuman los procedimientos y los eventos programados, que por omisión quedan afuera.
Crear la base vacía
El volcado trae tablas y datos, pero casi nunca la base ni el usuario. Entrá con sudo mariadb (o sudo mysql) y crealos:
CREATE DATABASE catalogo CHARACTER SET utf8mb4;
CREATE USER 'ana'@'localhost' IDENTIFIED BY 'una-clave-larga-y-unica';
GRANT ALL PRIVILEGES ON catalogo.* TO 'ana'@'localhost';utf8mb4es la codificación que guarda bien cualquier carácter, emojis incluidos. El viejoutf8de MySQL llega solo a tres bytes por carácter y los rompe.- Si el VPS tiene DirectAdmin, la base y el usuario se crean desde el panel, como en crear una base de datos MySQL en DirectAdmin, y el nombre queda con tu usuario del panel adelante.
La importación, sin depender de tu conexión
- Abrí una sesión de
tmux, para que la importación siga aunque se caiga el SSH:tmux new -s importacion. Se instala conapt install tmuxodnf install tmux. - Para no tener que escribir la clave en medio de la barra de avance, guardala en
~/.my.cnfcon el contenido que va a continuación y dejale permisos 600 conchmod 600 ~/.my.cnf. - Lanzá la importación con
pv, que muestra cuánto va y cuánto falta:pv catalogo.sql.gz | zcat | mariadb --default-character-set=utf8mb4 catalogo. Si el motor es MySQL, cambiámariadbpormysql.pvse instala conapt install pv; en AlmaLinux viene de EPEL. - Salí de la sesión sin cortarla con Ctrl+B y después D. Podés cerrar la terminal; para volver,
tmux attach -t importacion. - Si termina sin mensajes, salió bien. Cualquier error frena la carga y muestra en qué línea del archivo pasó.
[client]
user=ana
password=una-clave-larga-y-unicaCómo hacer que tarde menos
- Mientras dura la carga,
SET GLOBAL innodb_flush_log_at_trx_commit = 2;evita que el motor fuerce una escritura a disco en cada transacción. Suele acortar bastante la importación. Al terminar, volvé a ponerlo en 1, que es el valor seguro. - Si el VPS tiene memoria libre, un
innodb_buffer_pool_sizemás grande deja que los índices se armen en RAM en lugar de ir y venir del disco. - Un volcado con un
INSERTpor fila tarda muchísimo más que uno con inserciones agrupadas, que es lo que generamysqldumppor omisión. Si el archivo salió de otra herramienta configurada fila por fila, conviene exportarlo de nuevo. - Para bases de decenas de GB,
mydumperymyloaderexportan e importan varias tablas en paralelo.
Los errores que frenan la carga
| Mensaje | Qué pasó | Cómo seguir |
|---|---|---|
ERROR 2006 o 2013: el servidor se fue o se perdió la conexión | Una sentencia del archivo supera max_allowed_packet | Como root, SET GLOBAL max_allowed_packet = 1073741824; y agregá --max-allowed-packet=1G al cliente |
ERROR 1273: Unknown collation: 'utf8mb4_0900_ai_ci' | El volcado viene de MySQL 8 y tu versión de MariaDB no reconoce esa intercalación | Reemplazala mientras importás, con el primer comando de abajo |
ERROR 1227: falta el privilegio SUPER | Vistas, disparadores o rutinas con un DEFINER que no es tu usuario | Importá como root o quitá los DEFINER, con el segundo comando |
ERROR 1062: Duplicate entry | Estás cargando sobre tablas que ya tienen datos | Importá sobre una base vacía |
Eñes y acentos como ñ | El archivo se leyó con otra codificación | Repetí con --default-character-set=utf8mb4 |
Lo anterior a la línea del error quedó cargado. Corregida la causa, lo más limpio es vaciar la base e importar todo otra vez.
# intercalación de MySQL 8, reemplazada al vuelo
zcat catalogo.sql.gz | sed 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' | mariadb catalogo
# DEFINER de otro usuario, quitado al vuelo
zcat catalogo.sql.gz | sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' | mariadb catalogo
# ver la sentencia de la línea que falló (ejemplo: 4521)
zcat catalogo.sql.gz | sed -n '4521p' | cut -c1-300Comprobar que llegó todo
Que no haya errores no garantiza que esté completo, si el volcado ya venía cortado. Compará dos números entre origen y destino: la cantidad de tablas y la cantidad de filas de las dos o tres tablas que más te importan.
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'catalogo';
SELECT COUNT(*) FROM pedidos;- El número de filas que informa
information_schemapara tablas InnoDB es una estimación; para comparar en serio, contá conCOUNT(*)sobre cada tabla. - Después, apuntá la aplicación a la base nueva. En WordPress se cambian en
wp-config.phplas constantes con el nombre de la base, el usuario y la clave; el servidor de base queda enlocalhostsi está en el mismo VPS. - Borrá
~/.my.cnfy, si cambiasteinnodb_flush_log_at_trx_commit, devolvelo a 1.
Preguntas frecuentes
¿Qué hago si la importación se cortó a la mitad?
Borrá la base, creala vacía de nuevo e importá el archivo entero. Retomar desde la línea donde se cortó es posible pero engorroso, y con una base a medio cargar es fácil terminar con datos duplicados o faltantes.
¿Sirve el comando SOURCE dentro del cliente?
Sí: SOURCE /home/ana/catalogo.sql desde la consola de la base carga el archivo. Pero lo necesita descomprimido, imprime una línea por cada sentencia y no muestra avance. Para archivos grandes, la redirección con pv es más cómoda.
¿Conviene exportar con phpMyAdmin o con mysqldump?
Para una base chica da lo mismo. Para una grande, mysqldump: no tiene los límites de PHP, saca una copia coherente con --single-transaction y agrupa las inserciones, así que después se importa mucho más rápido.
¿Cuánto tarda una base de varios GB?
No hay una cifra fija: pesan más la velocidad del disco, la cantidad de índices y el tamaño de las transacciones que los gigabytes. La barra de pv te da una estimación real sobre tu archivo después de un par de minutos.
Seguí leyendo
Clave de root de MySQL o MariaDB: cómo cambiarla y recuperarla
Cómo saber si root entra por socket o con clave, cambiarla con ALTER USER y recuperarla si se perdió, en MySQL y MariaDB sobre Debian, Ubuntu y AlmaLinux.
6 min de lectura
Cómo dejar un proceso corriendo en el VPS después de cerrar SSH
tmux para trabajos largos, systemd-run para tareas de una sola vez y una unidad de systemd para lo que tiene que arrancar solo, con los errores más comunes.
7 min de lectura
Cómo crear una base de datos MySQL en DirectAdmin
Crear la base y el usuario en DirectAdmin, entender el prefijo, cargar los datos en WordPress u otro CMS, usar phpMyAdmin y resolver los errores típicos.
6 min de lectura
