Gratis Te mudamos el sitio y los correos sin cortes ni costo

0810 345 6377 ESEN, cambiar a inglés
InHosting
ESEN, cambiar a inglés

Servidores Linux

Importar una base MySQL o MariaDB grande por consola sin que se corte

Por el equipo técnico de InHosting7 min de lectura

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. mysqldump escribe al final una línea con Dump completed on y la fecha. Si zcat catalogo.sql.gz | tail -n 1 no 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 --version o mysql --version en el VPS, y SELECT VERSION(); en el origen. Pasar de MySQL 8 a MariaDB se puede, con una incompatibilidad conocida que se resuelve más abajo.
DistribuciónMariaDB de los repositorios oficiales
Debian 1210.11
Debian 1311.8
Ubuntu 24.0410.11 (también trae MySQL 8.0)
AlmaLinux 910.5 (también trae MySQL 8.0)
AlmaLinux 1010.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. rsync tambié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-transaction saca una copia coherente de las tablas InnoDB sin bloquearlas; --routines y --events suman 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';
  • utf8mb4 es la codificación que guarda bien cualquier carácter, emojis incluidos. El viejo utf8 de 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

  1. Abrí una sesión de tmux, para que la importación siga aunque se caiga el SSH: tmux new -s importacion. Se instala con apt install tmux o dnf install tmux.
  2. Para no tener que escribir la clave en medio de la barra de avance, guardala en ~/.my.cnf con el contenido que va a continuación y dejale permisos 600 con chmod 600 ~/.my.cnf.
  3. 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á mariadb por mysql. pv se instala con apt install pv; en AlmaLinux viene de EPEL.
  4. 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.
  5. 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-unica

Có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_size más grande deja que los índices se armen en RAM en lugar de ir y venir del disco.
  • Un volcado con un INSERT por fila tarda muchísimo más que uno con inserciones agrupadas, que es lo que genera mysqldump por omisión. Si el archivo salió de otra herramienta configurada fila por fila, conviene exportarlo de nuevo.
  • Para bases de decenas de GB, mydumper y myloader exportan e importan varias tablas en paralelo.

Los errores que frenan la carga

MensajeQué pasóCómo seguir
ERROR 2006 o 2013: el servidor se fue o se perdió la conexiónUna sentencia del archivo supera max_allowed_packetComo 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ónReemplazala mientras importás, con el primer comando de abajo
ERROR 1227: falta el privilegio SUPERVistas, disparadores o rutinas con un DEFINER que no es tu usuarioImportá como root o quitá los DEFINER, con el segundo comando
ERROR 1062: Duplicate entryEstás cargando sobre tablas que ya tienen datosImportá sobre una base vacía
Eñes y acentos como ñEl archivo se leyó con otra codificaciónRepetí 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-300

Comprobar 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_schema para tablas InnoDB es una estimación; para comparar en serio, contá con COUNT(*) sobre cada tabla.
  • Después, apuntá la aplicación a la base nueva. En WordPress se cambian en wp-config.php las constantes con el nombre de la base, el usuario y la clave; el servidor de base queda en localhost si está en el mismo VPS.
  • Borrá ~/.my.cnf y, si cambiaste innodb_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

¿Preferís que lo veamos juntos? Te atiende una persona.

Si la guía no alcanza para tu caso, contanos qué necesitás: te ayudamos a elegir el plan, a migrar o a configurar tu servidor.

Hablar con un técnico