MySQL-SELECCIONAR * EN OUTFILE LOCAL?


MySQL es impresionante! Actualmente estoy involucrado en una importante migración de servidores y anteriormente, nuestra pequeña base de datos solía estar alojada en el mismo servidor que el cliente.
Así que solíamos hacer esto: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

Ahora, movimos la base de datos a un servidor diferente y SELECT * INTO OUTFILE .... ya no funciona, comprensible - razones de seguridad creo. Pero, curiosamente LOAD DATA INFILE .... se puede cambiar a LOAD DATA LOCAL INFILE .... y bam, funciona.

No me estoy quejando ni estoy expresando disgusto hacia MySQL. La alternativa a eso agregó 2 líneas de código extra y una llamada al sistema forma a .script sql. Todo lo que quería saber es por qué LOAD DATA LOCAL INFILE funciona y por qué no hay tal cosa como SELECT INTO OUTFILE LOCAL?

Hice mi tarea, no pude encontrar una respuesta directa a mis preguntas anteriores. Tampoco pude encontrar una solicitud de característica @ MySQL. Si alguien puede aclarar eso, ¡ha sido increíble!

¿Es MariaDB capaz de manejar este problema?

Author: Up_One, 2010-05-19

6 answers

De la instrucción manual: The SELECT ... INTO OUTFILE está destinada principalmente a permitirle volcar muy rápidamente una tabla a un archivo de texto en la máquina servidor. Si desea crear el archivo resultante en algún host cliente que no sea el host del servidor, no puede usar SELECT ... INTO OUTFILE. En ese caso, debería usar un comando como mysql -e "SELECT ..." > file_name para generar el archivo en el host cliente."

Http://dev.mysql.com/doc/refman/5.0/en/select.html

Un ejemplo:

mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt
 47
Author: jerrygarciuh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-08 07:54:28

Puede lograr lo que desea con la consola mysql con la opción-s (silent silent) pasada.

Probablemente sea una buena idea pasar también la opción-r (raw raw) para que los caracteres especiales no se escapen. Puedes usar esto para canalizar consultas como quieras.

Mysql-u username-h hostname-p-s-r-e " select concat ('this','','works')"

EDITAR: Además, si desea eliminar el nombre de la columna de su salida, simplemente agregue otro-s (mysql-ss-r, etc.)

 7
Author: Waverly360,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-21 20:18:41

La ruta que le da a LOAD DATA INFILE es para el sistema de archivos de la máquina donde se está ejecutando el servidor, no para la máquina desde la que se conecta. LOAD DATA LOCAL INFILE es para la máquina del cliente, pero requiere que el servidor se haya iniciado con la configuración correcta, de lo contrario no está permitido. Puedes leer todo sobre esto aquí: http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

En cuanto a SELECT INTO OUTFILE No estoy seguro de por qué no hay una versión local, además de que probablemente sea difícil de hacer sobre el relación. Puede obtener la misma funcionalidad a través de la herramienta mysqldump, pero no mediante el envío de SQL al servidor.

 5
Author: Theo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-19 17:19:53

Re: SELECCIONE * EN OUTFILE

Compruebe si MySQL tiene permisos para escribir un archivo en el directorio OUTFILE del servidor.

 2
Author: Snowcrash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-19 17:15:57

Usar mysql CLI con la opción-e como sugiere Waverly360 es una buena opción, pero eso podría quedarse sin memoria y morir en resultados grandes. (No he encontrado la razón detrás de ello). Si ese es el caso, y necesita todos los registros, mi solución es: mysqldump + mysqldump2csv:

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
mysqldump -u username -p --host=hostname database table | python mysqldump_to_csv.py > table.csv
 2
Author: Vajk Hermecz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-27 10:59:30

Ya que me encuentro bastante regularmente buscando este problema exacto (con la esperanza de que me perdí algo antes...), finalmente decidí tomarme el tiempo y escribir un pequeño gist para exportar consultas MySQL como archivos CSV, un poco como https://stackoverflow.com/a/28168869 pero basado en PHP y con un par de opciones más. Esto fue importante para mi caso de uso, porque necesito poder afinar los parámetros CSV (delimitador, manejo de valores NULOS) Y los archivos deben ser CSV realmente válido, por lo que un simple CONCAT no es suficiente ya que no genera archivos CSV válidos si los valores contienen saltos de línea o el delimitador CSV.

Precaución: Requiere PHP para ser instalado en el servidor! (Puede comprobarse mediante php -v)

"Instalar" mysql2csv vía

wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv

(descargue el contenido del gist, compruebe la suma de comprobación y hágalo ejecutable)

Ejemplo de Uso

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

Genera archivo /tmp/result.csv con contenido

foo,bar
1,2

Ayuda para referencia

./mysql2csv --help
Helper command to export data for an arbitrary mysql query into a CSV file.
Especially helpful if the use of "SELECT ... INTO OUTFILE" is not an option, e.g.
because the mysql server is running on a remote host.

Usage example:
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

cat /tmp/result.csv

Options:
        -q,--query=name [required]
                The query string to extract data from mysql.
        -h,--host=name
                (Default: 127.0.0.1) The hostname of the mysql server.
        -D,--database=name
                The default database.
        -P,--port=name
                (Default: 3306) The port of the mysql server.
        -u,--user=name
                The username to connect to the mysql server.
        -p,--password=name
                The password to connect to the mysql server.
        -F,--file=name
                (Default: php://stdout) The filename to export the query result to ('php://stdout' prints to console).
        -L,--delimiter=name
                (Default: ,) The CSV delimiter.
        -C,--enclosure=name
                (Default: ") The CSV enclosure (that is used to enclose values that contain special characters).
        -E,--escape=name
                (Default: \) The CSV escape character.
        -N,--null=name
                (Default: \N) The value that is used to replace NULL values in the CSV file.
        -H,--header=name
                (Default: 1) If '0', the resulting CSV file does not contain headers.
        --help
                Prints the help for this command.
 0
Author: Hirnhamster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-16 11:33:06