Importar ficheros SQL de gran tamaño en MySQL

Estos días habréis comprobado (si me seguís a en twitter) que hemos estado peleándonos con la importación de un fichero de dimensiones considerables en MySQL. Concretamente el fichero pesaba casi 600MB y contenía instrucciones SQL correspondientes a una tabla de una base de datos con más de 12 millones de registros… la realidad es que no habíamos lidiado con algo de estas dimensiones hasta la fecha, y menos aun para tener que importarla desde una BBDD que existía previamente.

Ante este reto tienes varias alternativas… la mayoría de ellas ideas que NO funcionan. Hemos pensado que contarlas por aquí puede ahorraros a alguno de vosotros las pruebas ;)

Aplicación de administración con interfaz gráfica (FAIL #1)
Encontrar un programa de administración de base de datos MySQL que sea capaz de digerir semejante monstruito sin quedarse sin memoria fue una de las primeras opciones que barajamos. Navicat, las propias tools de MySQL oficiales, o incluso HeidiSQL (que te recomiendo probar, al menos si te pica la curiosidad, porque realmente es muy liviano y rápido) eran opciones que tenía a mano… pero que fueron infructuosas…

phpMyAdmin con algún tip (FAIL #2)
Desde luego inicialmente no parece una buena idea, porque de antemano existen problemas aun en local para cargar el fichero (por configuración de php). No obstante os dejo aquí un pequeño truco que permite acceder al fichero como si hubiera sido subido y que por tanto solo tendría que ir ejecutar las sentencias SQL según se van leyendo… Aquí el problema son los tiempos de ejecución máximos de PHP y el consumo de memoria. Aunque en nuestro caso no fue la solución, os dejo aquí los pasos para probarlo:

  1. Abrir el fichero config.inc.php que se encuentra en la carpeta phpmyadmin
  2. Dentro del fichero encontrar la línea que contiene la variable $cfg[‘UploadDir’] y asignarle un valor con el nombre de la carpeta que queráis, en nuestro caso «upload».
  3. Crear dentro de la carpeta phpmyadmin una carpeta con el nombre que pusisteis en el anterior punto («upload»).
  4. Copiar en su interior el fichero SQL que deseáis ejecutar sin tan siquiera subirlo por interfaz web de phpMyAdmin.
  5. Acceder a phpMyAdmin via navegador, entrar en la base de datos deseada donde importar la tabla y podréis comprobar que aparece un nuevo selector debajo del botón examinar que permite localizar los ficheros SQL que se encuentran en el directorio que indicamos en el fichero de configuración anteriormente.
  6. Seleccionar el fichero deseado y lanzar la ejecución.

Este método incluso detecta que es un fichero de grandes dimensiones y ofrece la posibilidad de continuar donde corte la ejecución, pero como os digo desgraciadamente en nuestro caso al cambo de un par de interrupciones falló todo.

Divide y venceras (FAIL #3, por cansancio)
Una opción que seguro es válida es encontrar un editor de texto que te permita abrir el fichero e ir haciendo las query con fragmentos más pequeños. No es tarea fácil porque no muchos editores de texto hoy en día te abren un fichero plano de 600MB (sus 12 millones de líneas) y encima te dejan moverte por el y hacer corta/pega. Por suerte SublimeText2 nuevamente me ha dado una alegría y podía abrirlo, pero llegados a este punto… a mi no me apetecía lanzar 120 queries de 100.000 líneas… muy cansado… descartado.

Script desde PHP (FAIL #4, no probado)
Otra opción que se me pasó por la cabeza fue ésta, incluso pensé en programar yo mismo el script, pero sonaba evidente que alguien tuvo que encontrarse en esta situación y seguro que había algo. Buscando por esa fuente interminable de información que es google, encontramos un script llamado BigDump . Tengo que reconocer que no lo he llegado a probar (aunque lo haré) porque antes he localizado (gracias @tonicarbonell) una solución que me ha gustado más.

Con respecto a BigDump añado que he encontrado hilos en Internet que dicen que para ficheros realmente grandes no acaba de funcionar, aunque esto evidentemente hay que comprobarlo en cada caso ya que puede deberse a muchos factores. Le damos un voto de confianza y seguro que lo probaré.

Desde línea de comandos (WIN!)
En mi caso estoy hablando de MS-DOS, ya que la importación la estaba haciendo en un equipo windows. Esta línea de acción ha resultado ser la más rápida, cómoda y efectiva, con diferencia.

Básicamente se trata de acceder a la línea de comandos y una vez allí localizar y acceder a la carpeta donde está la instalación de mysql:

cd d:\wamp\mysql\bin

(la ruta que mostrarmos evidentemente es la de la instalación en mi máquina).

Una vez estamos en ese directorio lanzamos la instrucción:

mysql.exe -use nombreMiBaseDeDatos -u root -p

Nos preguntrará la contraseña para el usuario que indiquemos (en el ejemplo anterior «root») y una vez conectados nos mostrará un símbolo de consola como este:

mysql> 

Donde ya podremos ejecutar la sentencia que nos permita lanzar la ejecución del fichero en cuestión:

mysql> source d:\wamp\pypmyadmin\upload\miFichero.sql;

(en nuestro ejemplo el fichero estaba en esa ruta, pero podrías incluso colocarlo en la carpeta mysql y de esta forma simplemente poner su nombre sin ruta).

En ese momento la línea de comandos comenzará a trabajar como si estuviera poseída, ejecutando sentencias durante el tiempo que sea necesario hasta terminar. En nuestro caso se ha tirado más de 15 minutos… pero esto lógicamente depende de la potencia de la máquina, rendimiento, etc.

Así que ya sabéis, si os enfrentáis alguna vez a un fichero SQL de dimensiones considerables, la línea de comandos demuestra ser totalmente efectiva y por cierto, bastante rápida :)