Separar un fichero SQL con mysqldump en tablas individuales

En el siguiente caso tenemos un volcado enormemente grande de una tienda ( ElasticPath ) que almacena una cantidad brutal de datos de logs, sesiones y carritos. Importar una base de datos de unos 2 o 3 Gb nos puede llevar un buen rato, y nosotros sólo queremos algunas tablas… así que hemos decidido separar el volcado SQL por tablas.
Pero antes vamos a echar un vistazo al fichero a separar :

ElasticPath5-table.sql
Vemos que tenemos la sentencia DROP TABLE al comienzo de cada tabla por que le hemos agregado la opcion –add-drop-table en el momento de lanzar el volcado con mysqldump.
Por lo que nos interesa lanzar el ‘split‘ por cada DROP y meterlo en un fichero. Para ello lo vamos a hacer con el ultrapoderoso PERL:

perl -n -e '/^DROP TABLE/ and open F, sprintf(">output_%03d.sql",$n++); print F;' ElasticPath5-tables.sql

Bajate el fichero de ejemplo y lanzalo en la consola, acojonante eh !

Vamos a ver que es lo que hace realmente :

1.- Le estamos pasando el fichero ElasticPath5-tables.sql con el parametro -n se ejecuta en modo while()  infinito mientras tenga lineas del fichero  ElasticPath5-tables.sql y con -e ejecuta el codigo indicado
2.- El codigo ejecutado lo vamos a dividir en varias partes, pero antes hay que tener en cuenta que esa linea de código se ejecuta por cada linea del fichero ElasticPath5-tables.sql
2a .- /^DROP TABLE/ and open F, sprintf(«>output_%03d.sql»,$n++);
2b .- print F;

Primero vemos que hace un chorro de cosas en perl y luego hace un «print F«. Si os fijais hay un «;» que indica separación de lineas de ejecución, con lo que se ejecutará si o sí.
La parte primera, consta de dos partes a su vez

3a .- Primera parte : /^DROP TABLE/
Busca la cadena de texto «DROP TABLE» y que esté al comienzo de la linea
3b .- Segunda parte : open F, sprintf(«>output_%03d.sql»,$n++);
Abre un fichero «F» con el nombre output_000 formateado a decimales relleno de 0 según el valor de $n

¿ Hasta aquí todo claro ? se ve un poco más la luz ?

Lo que hace realmente es busca por «DROP TABLE» y si lo encuentra abre un fichero y pone $n a +1 , y comienza a escribir las lineas ( acordaos del print «F» ).
En el momento en que encuentra otro «DROP TABLE» cambia el nombre de fichero ya que el «open» sólo se hace en caso de que haya concordancia con la expresión regular y
a partir de ese momento todo el fichero se empieza a redirigir al nuevo fichero.

Efectivamente no hay «closes» para los ficheros, pero oiga, funciona de maravilla y para un apaño bien viene


Publicado

en

por

Etiquetas:

Comentarios

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.