martes, 10 de marzo de 2015

Acelerar importación de Base de Datos MySQL desde consola

HOla!
Esta ocasión platico lo que me pasó. Tratando de cargar una base de datos bastante grande (una tabla cuyo sql era de aprox 6GB), me encontré con la dificultad de que al importarlo a través de la linea de comandos de MySQL tardaba un demonial, más de lo que podría suponerse, tardando 20 segundos o más por cada 1000 registros (hablábamos de unos 5 millones de registros).
Me di cuenta que el dump lo habían generado desde una útil herramienta llamada SQLyog y que mi compañero desde su máquina haciendo el import con la misma herramienta tardaba muuuucho menos que yo.
Entonces vi que el archivo sql del dump no contenía ninguna clase de comentario ni directiva extra más que la carga de los datos, es decir, el create de la tabla y los inserts, ¡Ah claro! y que había sido hecho por SQLyog.

Encontré una página con algunas estrategias para acelerar los procesos de dump y de importación:

Aquí

Entre ellos uno me llamó la atención y parece la solución a mi problema. Al restaurar desde consola en linux sería bueno activar las directivas para cancelar varios chequeos que hace MySQL y acelerar el proceso.

(
    echo "SET AUTOCOMMIT=0;"
    echo "SET UNIQUE_CHECKS=0;"
    echo "SET FOREIGN_KEY_CHECKS=0;"
    cat dump.sql
    echo "SET FOREIGN_KEY_CHECKS=1;"
    echo "SET UNIQUE_CHECKS=1;"
    echo "SET AUTOCOMMIT=1;"
    echo "COMMIT;"
) | mysql -u... -p... target_database

o podemos crear un archivo para ejecutar desde el shell:

#!/bin/bash
MYSQL_USER="..."
MYSQL_PASSWORD="..."

function restore() {
    echo $1;
    (
        echo "SET AUTOCOMMIT=0;"
        echo "SET UNIQUE_CHECKS=0;"
        echo "SET FOREIGN_KEY_CHECKS=0;"
        cat "$1.sql"
        echo "SET FOREIGN_KEY_CHECKS=1;"
        echo "SET UNIQUE_CHECKS=1;"
        echo "SET AUTOCOMMIT=1;"
        echo "COMMIT;"
    ) | mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$1"
}

Con esto aceleramos mucho la inserción, sin embargo de todos modos tarda.

En la página donde saqué estas cosas también vienen otras recomendaciones que pueden ser bastante útiles al exportar e importar Bases de Datos en MySQL.


No hay comentarios:

Publicar un comentario