Importar fichero SQL de gran tamaño (actualizado)

A partir del problema para importar un fichero SQL de gran tamaño (https://www.cesarmansilla.com/blog/2014/11/21/importar-fichero-sql-de-gran-tamano/) me topé con la necesidad de optimizar aún más el proceso, ya que al tener que pasar esta base desde el servidor de desarrollo al servidor de producción la solución planteada no resultó la más óptima.

Lo que hice fué sencillo, pero en una primera instancia se me pasó por alto: creé el fichero .sql nuevamente, pero esta vez con batch inserts. El fichero final resultó de 1/4 parte del peso (de 442MB a 123MB). Luego lo comprimí con 7-Zip para obtener un archivo .gz de 43MB. Nada mal!

Al código que utilicé en un principio le hice algunos ajustes y quedó de la siguiente manera:

<?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

$archivo = "elfichero.txt";

$data = file($archivo);

$file = fopen("mysql_full_batch.sql", "a");

$template = $sql = "INSERT INTO `codigos` (`codigo`) VALUES ";
$filas_x_batch = 1000;             // CADA CUANTOS REGISTROS QUIERO UN NUEVO BATCH
$cant_registros = count($data);

$c = 0;                            // CONTADOR TEMPORAL, PARA CADA BATCH
$cg = 0;                           // CONTADOR GENERAL
foreach($data as $codigo){
    if($c == 0){                   // SI COMIENZA UN NUEVO BATCH...
        $sql = $template . PHP_EOL . "('".trim($codigo)."')";
    }else{                         // CONTINUO CON EL QUE ESTABA TRABAJANDO...
        $sql = "('".trim($codigo)."')";
    }

    if($c == $filas_x_batch || $cg == ($cant_registros - 1)){ // FIN DEL BATCH O LLEGUÉ AL FINAL DE BUCLE
        $sql .= ";";

        $c = 0;
    }else{
        $comma = array_key_exists(($c+1), $data);
        if($comma){
            $sql .= ", ";
        }

        $c++;
    }

    fwrite($file, $sql . PHP_EOL);
    
    $cg++;
}

fclose($file);
?>

Este es el ejemplo de lo que genera el script:

INSERT INTO `codigos_tmp` (`codigo`) VALUES 
('123'), 
('456'), 
('789');
INSERT INTO `codigos_tmp` (`codigo`) VALUES 
('123b'), 
('456b'), 
('789b');

Saludos!

Deja un comentario

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