Importar fichero SQL de gran tamaño

Me topé con la necesidad de importar un fichero SQL de gran tamaño (8,500,00 registros) a mi base de datos. Pasé por varias instancias antes de encontrar la solución.

En principio, los códigos me fueron entregados en un fichero txt, separados cada uno por un salto de linea (al menos es algo). El tamaño de este archivo era de 89MB, a partir de acá sabía que estaba frente a un problema.

Intento #1: Procesar el fichero tal como estaba. Pasaron 5 minutos y recién se habían insertado 6,000 registros…

Cambié algunas directivas para asegurarme de que no se generara un timeout,  leí el contenido del archivo y lo recorrí con un bucle, primero intenté insertar en base directamente, luego mostrar las consultas en pantalla. Ninguna funcionó.

<?php
error_reporting(E_ALL);            // MOSTRAR ERRORES EN PANTALLA
set_time_limit(0);                 // LIMITE DE TIEMPO DE EJECUCION DEL SCRIPT
ini_set('memory_limit', '2048M');  // LIMITE DE MEMORIA

// Nombre del archivo
$archivo = "elfichero.txt";

// Almaceno el contenido en un array
$data = file($archivo);

// Recorro...
foreach($data as $codigo){
    $sql = "INSERT INTO `codigos` (`codigo`) VALUES ('".trim($codigo)."');";
    // Probé con las 2 alternativas y nada...
    //mysql_query($sql);
    //echo $sql . "<br />";
}
?>

Intento #2: Divide y vencerás (si no te cansas antes)…

Abrí el archivo y fuí dividiendolo en varios archivos más pequeños(copy / paste). En principio fueron de a 1,000,000 de códigos, luego 500,000 y así… Después pensaba recorrer cada uno de estos archivos, pero ejecutar tantas consultas no solucionaba el problema.

Intento #3: Desde linea de comandos. Consta de varios pasos porque tuve que crear el archivo “.sql“, pero si ya tenés este archivo, solamente deberás hacer la parte de ejecución desde consola.

Creación del archivo SQL:

<?php
error_reporting(E_ALL);              // MOSTRAR ERRORES EN PANTALLA
set_time_limit(0);                   // LIMITE DE TIEMPO DE EJECUCION DEL SCRIPT (TIMEOUT)
ini_set('memory_limit', '2048M');    // LIMITE DE MEMORIA

// Nombre del archivo
$archivo = "elfichero.txt";

// Almaceno el contenido en un array
$data = file($archivo);

// Creo el archivo .sql
$file = fopen("mysql_full.sql", "a");

// Recorro...
foreach($data as $codigo){
    // Agrego una consulta por linea
    $sql = "INSERT INTO `codigos` (`codigo`) VALUES ('".trim($codigo)."');";
    fwrite($file, $sql . PHP_EOL);
}

// Cierro el archivo
fclose($file);
?>

Ejecución desde consola:

Abrir la consola (Inicio > “cmd” desde Windows) y ubicarse el directorio donde la instalación de MySQL, por ejemplo.

cd c:\wamp\mysql\bin

Nos conectamos a la base de datos con la siguiente instrucción (luego de ejecutarla nos pedirá ingresar la contraseña):

mysql.exe -use [nombre_base_datos] -u [user] -p

A partir de acá podemos ejecutar sentencias en nuestra base de datos, en nuestro caso ejecutaremos las sentencias del archivo “mysql_full.sql” que acabamos de crear (442MB):

mysql> source d:[ruta]\[al]\[directorio]\mysql_full.sql;

Solo resta esperar a que termine la ejecución, el tiempo dependerá de la potencia del equipo. Pero sin duda es la forma más rápida y efectiva de importar fichero SQL de gran tamaño.

Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *