Cómo importar una base de datos MySQL grande por consola

· 5 min de lectura · por el equipo técnico de VPS Argentina

Para importar una base grande, subí el volcado al servidor con scp o SFTP y cargalo por consola con mysql -u usuario -p base < archivo.sql, o con gunzip < archivo.sql.gz | mysql -u usuario -p base si está comprimido. Por consola no rigen los límites de subida y de tiempo que cortan a phpMyAdmin. Creá antes la base y el usuario, importá con --default-character-set=utf8mb4 y, si falla con "MySQL server has gone away", subí max_allowed_packet. Si tu hosting no tiene acceso por consola, escribinos por ticket.

Por qué phpMyAdmin corta con archivos grandes

phpMyAdmin recibe el archivo por el navegador y lo procesa con PHP, así que lo frenan dos límites del servidor. El primero es el tamaño máximo de subida, que fijan upload_max_filesize y post_max_size, y que aparece al lado del botón para elegir el archivo. El segundo es el tiempo máximo de ejecución, y es el más traicionero: la importación arranca, corre un rato y se corta a la mitad, con la base cargada en parte.

Por consola no hay ninguno de los dos: el cliente mysql lee el archivo directo del disco del servidor y tarda lo que tenga que tardar.

Subí el archivo al servidor

Desde la terminal de tu computadora (PowerShell en Windows 10 y 11, o la de macOS y Linux), scp copia el archivo por SSH:

scp tienda.sql.gz root@203.0.113.24:/root/
  • Si cambiaste el puerto de SSH, en scp se indica con -P, en mayúscula: scp -P 2222 tienda.sql.gz root@203.0.113.24:/root/.
  • Si preferís algo gráfico, FileZilla o WinSCP hacen lo mismo por SFTP, con el mismo usuario y la misma clave de SSH. No uses FTP sin cifrar.
  • Si el volcado no está comprimido, comprimilo antes con gzip tienda.sql. Es texto, así que queda mucho más chico y se sube más rápido.

Creá la base y el usuario antes

El volcado trae las tablas y los datos, pero normalmente no la base ni el usuario. Entrá como root con mysql (o con mysql -u root -p, si tu root usa clave) y crealos:

CREATE DATABASE tienda CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'juan'@'localhost' IDENTIFIED BY 'una-clave-larga';
GRANT ALL PRIVILEGES ON tienda.* TO 'juan'@'localhost';
  • En un servidor con DirectAdmin, la base y el usuario se crean desde el panel, en la sección de MySQL. El nombre queda con tu usuario adelante, como juan_tienda.

Importá por consola

Con la base creada y el archivo en el servidor, desde una sesión de SSH:

mysql -u juan -p --default-character-set=utf8mb4 tienda < tienda.sql
  • Te pide la clave de juan y empieza. Mientras importa no muestra nada; si termina sin errores, vuelve al prompt sin ningún mensaje.
  • Ojo con el espacio: en -p tienda, el -p pide la clave y tienda es la base. Pegado, -ptienda, tomaría tienda como clave.
  • Si lo subiste comprimido, no hace falta descomprimirlo: gunzip < tienda.sql.gz | mysql -u juan -p --default-character-set=utf8mb4 tienda lo descomprime al vuelo, sin ocupar lugar extra en el disco. zcat tienda.sql.gz en lugar de gunzip < tienda.sql.gz hace lo mismo.
  • --default-character-set=utf8mb4 evita que las eñes y los acentos queden rotos si el archivo no declara su juego de caracteres.
  • Para ver el avance, pv muestra una barra con el tiempo estimado: pv tienda.sql.gz | gunzip | mysql -u juan -p --default-character-set=utf8mb4 tienda. Se instala con apt install pv; en AlmaLinux está en EPEL, así que primero va dnf install epel-release y después dnf install pv. Si la barra tapa el pedido de clave, escribila igual y apretá Enter.

Si la importación falla

MensajePor qué pasaQué hacer
MySQL server has gone away (en MariaDB, Server has gone away), error 2006Una sentencia del archivo supera max_allowed_packet, el tamaño máximo que acepta el motor.Como root, en mysql: SET GLOBAL max_allowed_packet = 268435456; (256 MB, vale hasta que reinicies el motor). Después importá de nuevo agregando --max-allowed-packet=256M al comando.
Unknown database, error 1049La base no existe.Creala antes, como en el paso anterior.
Access denied for user, errores 1044 y 1045Con 1045, el usuario o la clave no coinciden. Con 1044, el usuario no tiene permisos sobre esa base.Revisá la clave y el GRANT sobre la base.
Unknown collation: 'utf8mb4_0900_ai_ci', error 1273El volcado viene de MySQL 8 y tu MariaDB no conoce esa intercalación.Reemplazala en el archivo descomprimido: sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' tienda.sql.
Eñes y acentos como ñ o éEl archivo se leyó con otro juego de caracteres.Importá de nuevo con --default-character-set=utf8mb4.

La importación se frena en el primer error y lo anterior queda cargado. Los volcados de mysqldump borran y recrean cada tabla, así que, corregida la causa, podés importar el archivo entero otra vez.

Si tu hosting no tiene acceso por consola

Sin SSH no hay forma de correr mysql en el servidor, y phpMyAdmin tiene los límites de arriba. Escribinos por ticket con el tamaño del archivo y te indicamos cómo hacerlo en tu plan.

Preguntas frecuentes

¿Cómo exporto la base desde el servidor viejo?

Con mysqldump, comprimiendo al vuelo: mysqldump --single-transaction --routines -u juan -p tienda | gzip > tienda.sql.gz. --single-transaction saca una copia coherente sin bloquear las tablas InnoDB, y --routines suma los procedimientos almacenados. Si venís de otro proveedor, la migración es sin cargo: escribinos por ticket.

¿Qué pasa si se corta la conexión en medio?

La importación se corta con la sesión. Para no depender de tu conexión, corrila dentro de tmux (se instala con apt install tmux o dnf install tmux): si se cae el SSH, sigue corriendo, y la retomás con tmux attach.

¿Cuánto tarda?

Depende del tamaño del archivo, de cuántos índices tengan las tablas y del disco: los índices se arman a medida que entran los datos. Con pv ves el avance y una estimación del tiempo que falta.

¿Qué cambio en mi sitio después de importar?

Que apunte a la base nueva. En WordPress, por ejemplo, son DB_NAME, DB_USER y DB_PASSWORD en wp-config.php. Si la base está en el mismo servidor que el sitio, DB_HOST es localhost.

Seguí leyendo