Publi

Exportar datos de MySQL a un fichero CSV o tabulado


En múltiples ocasiones, si sueles manejar bases de datos MySQL, te interesará exportar esa información para que sea interpretada por otro programa o una persona, y no queramos que dicha persona tenga acceso completo a nuestra base de datos, o que le queramos facilitar el trabajo de alguna forma.

Este post, puede acompañar perfectamente a Introduciendo datos al servidor MySQL desde CSV con ejemplos.

Es importante decir, que el archivo se generará en el equipo servidor, y no en el equipo desde el que accedemos, por lo que para recuperar los datos, es conveniente tener acceso al servidor, puede que por estar en el mismo ordenador (localhost) o porque tengamos acceso por SSH, FTP, etc.

Bien, el siguiente código extraerá información de una consulta a una base de datos MySQL, la gracia está en que la salida se escribirá directamente en un fichero separado por tabuladores.

1
SELECT * INTO OUTFILE '/tmp/temp' FROM Tabla;

A partir de aquí, podemos dejar llevar nuestra imaginación, para crear una consulta con la complicación que queramos, en este caso, estaremos guardando el resultado de la consulta en el archivo indicado, sin cabeceras, sólo datos. Si queremos cabeceras, tendremos que complicar un poco la consulta:

1
SELECT 'Columna1', 'Columna2, 'ColumnaN' UNION SELECT Columna1, Columna2, ColumnaN INTO OUTFILE '/tmp/temp' FROM Tabla

Aquí combinamos dos SELECT, en este caso, el primer SELECT serán los nombres de las columnas, y otro será la consulta con la que obtendremos las filas.

Pero visto así no tiene mucha gracia, ya que generamos un archivo cuya separación entre campos son tabuladores, y puede no sernos útil para su visualización en una hoja de cálculo, o incluso para su extracción automática; por tanto tenemos otra forma de exportar esa información, especificando un delimitador de campo, de línea y cercado, con lo que podemos generar un fichero CSV, donde separemos la información por comas, las líneas por retornos de carro y los campos complejos podamos entrecomillarlos, adicionalmente podemos escapar ciertos caracters con algún carácter especial.

En este caso, toda la información estará delimitada, y podrá ser importada por software de hoja de cálculo fácilmente como Libreoffice Calc, OpenOffice Calc, Gnumeric, o Microsoft Excel.

Precaución, el usuario mysql (o el usuario con el que se ejecuta mysql debe tener permisos de creación en el directorio seleccionado); el archivo NO puede existir, esto es una medida de precaución para que no nos podamos cargar nada al crear archivos con MySQL; y, por último, tenemos que tener el permiso FILE en el usuario de mysql con el que estemos haciendo la consulta, para ello podemos, desde root, hacer lo siguiente:

1
GRANT FILE ON *.*  TO 'usuario'@'host' ;

Como aclaración, debo recalcar que el permiso FILE es para usuarios de MySQL no de nuestro sistema; y el query anterior debe ser lanzado como root de MySQL.

¿No os apetece leer mucho? Hice un vídeo para esto:

Actualización 26/02/2015: Tenía dos posts que trataban de lo mismo, he unificado los dos posts en este. ¡Qué despiste!
Actualización 11/02/2017: He añadido un vídeo!!

También podría interesarte....

There are 5 comments left Ir a comentario

  1. Pingback: Exportar desde MySQL a CSV | Poesía Binaria /

  2. Sergio /
    Usando Google Chrome Google Chrome 40.0.2214.115 en Linux Linux

    Queria saber como saco el archivo del server.
    Tengo un linux con mysql(5.1.61) instalado y en phpmyadmin ejecuto:

    select * from usuario into outfile «\\\\190.1.1.1\\carpeta_compartida\\archivo.txt»
    (la ip 190.1.1.1 es el server donde esta intalado mysql)

    me dice que se ejecuto correctamente pero cuando los busco en la carpeta_compartida no esta.

    tambien ejecuto:

    select * from usuario into outfile «../../../carpeta_destino/archivo.txt»

    y tampoco, me arroja un error de lectura/escritura, pero la carpeta tiene todos los permisos dados para que cualquiera modifique, cree.
    Los permisos se los doy con chmod -R 777 carpeta_compartida

    Basicamente necesito que desde una web se descarguen reportes en un .csv con datos extraidos de la base de datos y lo quiero hacer de esta manera porque es la mas rapida y eficiente. Puedo hacer una consulta a la base y con un ciclo for o while ir llenando el archivo pero tarda mucho si son 100 mil datos por ejemplo.

    Hay alguna manera de sacar ese fichero del server?
    Hay otra funcion que permita descargar este fichero?

    Muchas Gracias.
    Saludos

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 38.0 en Ubuntu Linux Ubuntu Linux

      Hola Sergio,

      En este caso, MySQL sólo puede escribir en carpetas locales (o al menos que las tengas montadas como una carpeta local), además, lo suyo es utilizar una ruta absoluta tipo «/tmp/una_ruta.txt» porque no se basará en el directorio en el que tú estés actualmente. Piensa que tú estás ejecutando el cliente en una carpeta, pero el servidor puede estar ejecutándose desde otro sitio.

      Para estas ocasiones, lo suyo es generar el archivo csv en servidor, y una vez generado puedes utilizar cualquier protocolo o programa para descargar el archivo, por ejemplo:
      Desde tu ordenador:
      $ scp usuario@servidor:/ruta/dentro/del/servidor.csv local.csv (con esto copias el fichero en tu ordenador)
      $ rsync -avzh usuario@servidor:/ruta/dentro/del/servidor.csv local.csv (haces lo mismo que antes, pero rsync te deja hacer más cosas, por ejemplo comprimir automáticamente la transferencia si es un archivo grande).

      Puedes utilizar también FTP.

      O desde el servidor puedes enviártelo por correo. Mírate: https://github.com/gasparfm/gscripts/blob/master/gemail.sh es un script que te permitirá enviar un archivo adjunto por e-mail de forma sencilla desde la linea de comandos.

      Un saludo!

  3. Pingback: Formas de eliminar etiquetas XML/HTML desde MySQL o MariaDb. strip_tags en MySQL – Poesía Binaria /

  4. Carlos Martinez /
    Usando Google Chrome Google Chrome 116.0.0.0 en Windows Windows NT

    Excelente video, resolvio mi problema, mi consulta fue: «SELECT ‘id’, ‘firstname’, ‘lastname’, ‘companyname’, ‘email’
    UNION SELECT id, firstname, lastname, companyname, email
    INTO OUTFILE ‘//var/lib/mysql-files/report_tblclients6.csv’
    FROM tblclients;» GRACIAS!!!!!!!

Leave a Reply