Ejecutar archivo SQL desde consola y guardar salida en archivo

Ni para que decir que escribiré continuamente, cuando probablemente no sea así, me gustaría pero la falta de inspiración y/o tiempo me ha complicado el saber que escribir… tras escuchar algunos consejos regresaré a mis inicios, a lo que me gusta, por lo que surgió esta página hace algunos ayeres, para programar y difundir lo poco que se.

Me he metido a programar MySQL desde la terminal (de autobuses del ADO) y ha sido gratificante esta nueva experiencia, pero me encontré con un pequeño problema, tratar de ejecutar un Query de aproximadamente 2000 líneas (no pregunten por que tantas), y guarda el resultado en un archivo (csv, txt o dat).

Para guardar una consulta en un archivo la sintaxis es:

> mysql -h [servidor] -u [usuario] -p [contraseña] [base_datos] -e "query" -B > [archivo_salida].[extensión]
> mysql -h localhost -u root -p root mi_base -e "SELECT * FROM cat_clientes" -B > cat_clientes.csv

¡Excelente! funciona, pero ¿como diablos meto 2000 líneas entre comillas en esa consulta?, Googleando hallé la solución, para ejecutar un query almacenado en un archivo de sql la sintaxis es:

> mysql -h [servidor] -u [usuario] -p [contraseña] [base_datos] < [archivo_entrada].[extensión]
> mysql -h localhost -u root -p root mi_base < get_clientes.sql

Pero ¿Y ahora? ¿cómo ejecuto un SQL y guardo el resultado en un archivo? Obvio, combinando las 2 instrucciones… bueno casi, por que la lógica nos dice que se unen y ya, pero hay elementos que habrá que quitar, la sintaxis sería algo así:

> mysql -h [servidor] -u [usuario] -p [contraseña] [base_datos] < [archivo_entrada].[extensión] | sed 's/\t/,/g' > [archivo_salida].[extensión]
> mysql -h localhost -u root -p root mi_base < get_clientes.sql | sed 's/\t/,/g' > cat_clientes.csv

¡Perfecto! ahora hemos ejecutado nuestro sql y guardamos el resultado en un archivo.

Pd0: No faltará quien escriba que hubiese sido mejor con la instrucción «INTO OUTFILE» dentro de la consulta, pero yo tenía/tengo otro problema… El acceso a la base de datos es remoto mediante VPN y el archivo que se generaba se almacenaba en el servidor y no en mi maquina local.

Pd1: No faltará quien escribirá ¿por qué no se hizo un puenteo entre nodos mediante SSH y así podría mover/copiar el archivo resultante? por el hecho de que por los permisos no es posible borrar los archivos generados.

Pd2: No faltará quien escriba que hay otras y/o mejores soluciones, las cuales me encantaría conocer, por que de eso se trata la programación de mejorar constantemente entre todos y compartir el conocimiento.