Pregunta

MySQL es increíble! Actualmente estoy involucrado en una importante migración del servidor y anteriormente, nuestra pequeña base de datos utilizada para ser alojados en el mismo servidor que el cliente.
así que utilizamos para hacer esto: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

Ahora, hemos movido 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 quejo ni estoy expresando disgusto hacia MySQL. La alternativa a la que añadieron 2 líneas de código extra y una llamada al sistema forman un script .sql. Todo lo que quería saber es por qué funciona la LOAD DATA LOCAL INFILE y por qué no hay tal cosa como SELECT INTO OUTFILE LOCAL?

hice mi tarea, no pudo encontrar una respuesta directa a mis preguntas anteriores. No pude encontrar una solicitud de función @ MySQL tampoco. Si alguien puede aclarar eso, tenían que ser impresionante!

es MariaDB capaz de manejar este problema?

¿Fue útil?

Solución

Desde el manual: declaración The SELECT ... INTO OUTFILE está destinado principalmente a dejarle volcar rápidamente una tabla a un archivo de texto en la máquina servidor. Si desea crear el archivo resultante en un equipo cliente que no sea el anfitrión del servidor, no se puede utilizar SELECT ... INTO OUTFILE. En ese caso, debería usar un comando como mysql -e "SELECT ..." > file_name para generar el archivo en el equipo 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

Otros consejos

Se puede lograr lo que quiere con la consola de MySQL con la -s (--silent) opción se ha pasado.

Es probablemente una buena idea para pasar también en la opción -r (--raw) de modo que los caracteres especiales no se les escaparon. Usted puede usar esto para consultas de tubería que estás deseando.

mysql -u nombre de usuario -p -s -h host -r -e "select concat ( 'esto','', 'obras')"

EDIT: Además, si se desea eliminar el nombre de la columna de su salida, sólo tiene que añadir otro -s (. Mysql -SS -r etc)

La ruta que le das a LOAD DATA INFILE es para el sistema de archivos en la máquina donde se ejecuta el servidor, no la máquina se conecta desde. LOAD DATA LOCAL INFILE es para la máquina del cliente, pero requiere que el servidor se inició con la configuración correcta, de lo contrario no está permitido. Puede leer todos los detalles aquí: http: // dev .mysql.com / doc / RefMan / 5,0 / en / de carga-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, siendo difícil de hacer sobre la conexión. Usted puede obtener la misma funcionalidad a través de la herramienta mysqldump, pero no a través de envío de SQL para el servidor.

Uso de la CLI de MySQL con la opción -e como sugiere Waverly360 es una buena idea, pero que podría salir de la memoria y ser asesinado en grandes resultados. (Havent encontrar la razón detrás de ella). Si ese es el caso, y lo que 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

Re: SELECT * INTO OUTFILE

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

Desde que me encuentro bastante regularidad buscando este problema exacto (con la esperanza de que me perdí algo antes ...), que finalmente decidió tomar el tiempo y escribir un pequeña GIST a las consultas de MySQL de exportación como archivos CSV , un poco como https: //stackoverflow.com/a/28168869 pero basado en PHP y con un par de opciones más. Esto era importante para mi caso de uso, porque tengo que ser capaz de ajustar los parámetros CSV (delimitador, manejo de valor NULL) y los archivos deben ser CSV realmente válida, por lo que un simple CONCAT no es suficiente, ya que doesn' t generar archivos CSV válido si los valores contienen saltos de línea o el delimitador CSV.

Atención: Requiere PHP para ser instalado en el servidor (Se puede comprobar a través de php -v)

"Instalar" mysql2csv través de

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

(contenido de descarga de la esencia, la suma de comprobación y verificación de hacerlo ejecutable)

Ejemplo de uso

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

genera /tmp/result.csv archivo 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top