variable unload outfile into from dual comando mysql sql mariadb into-outfile

unload - MySQL-¿SELECCIONAR*EN OUTFILE LOCAL?



select mysql into outfile (6)

MySQL es increíble! Actualmente estoy involucrado en una importante migración de servidor y anteriormente, nuestra pequeña base de datos solía estar alojada en el mismo servidor que el cliente.
Entonces 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, entendible, 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 adicional y una llamada al sistema desde un script .sql. Todo lo que quería saber es por qué funciona LOAD DATA LOCAL INFILE y por qué no existe SELECT INTO OUTFILE LOCAL ?

Hice mi tarea, no pude encontrar una respuesta directa a mis preguntas anteriores. No pude encontrar una solicitud de función @ MySQL tampoco. Si alguien puede aclarar eso, ¡eso fue increíble!

¿MariaDB es capaz de manejar este problema?


Como me encuentro bastante regularmente buscando este problema exacto (con la esperanza de haberme perdido algo antes ...), finalmente decidí tomarme el tiempo y escribir una pequeña idea para exportar consultas MySQL como archivos CSV , algo así como share pero basado en PHP y con un par de opciones más. Esto fue importante para mi caso de uso, porque necesito poder ajustar los parámetros CSV (delimitador, manejo de valores NULL) Y los archivos necesitan ser CSV realmente válidos, de modo que un CONCAT simple no es suficiente ya que no funciona t generar archivos CSV válidos si los valores contienen saltos de línea o el delimitador CSV.

Precaución: ¡Requiere que PHP esté instalado en el servidor! (Puede verificarse 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

(descargue el contenido de la esencia, verifique la suma de verificació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.


Del manual: The SELECT ... INTO OUTFILE declaración The SELECT ... INTO OUTFILE está destinada principalmente a permitirle volcar rápidamente una tabla a un archivo de texto en la máquina del servidor. Si desea crear el archivo resultante en un host de cliente que no sea el host del servidor, no puede usar SELECT ... INTO OUTFILE . En ese caso, en su lugar debe usar un comando como mysql -e "SELECT ..." > file_name para generar el archivo en el host del 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


El uso de la CLI de mysql con la opción -e como sugiere Waverly360 es buena, pero podría quedarse sin memoria y morir en grandes resultados. (Havent encuentra la razón detrás de esto). 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


La ruta que le da a LOAD DATA INFILE es para el sistema de archivos en la máquina donde se ejecuta 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. Puede leerlo al respecto 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 complicado hacer la conexión. Puede obtener la misma funcionalidad a través de la herramienta mysqldump , pero no mediante el envío de SQL al servidor.


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

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

mysql -u nombre de usuario -h nombre-host -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.)


Re: SELECCIONAR * EN OUTFILE

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