2010-05-19 14 views
31

¡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.
Así que solíamos hacer esto: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....MySQL - ¿SELECCIONAR * EN OUTFILE LOCAL?

Ahora, movimos la base de datos a un servidor diferente y SELECT * INTO OUTFILE .... ya no funciona, comprensible, por 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?

+0

hay una alternativa que implica el uso del comando tee que le permite registrar la entrada y salida de mysql a una archivo separado en el lado del cliente, sin embargo, esto registra toda la sesión de MySQL, en lugar de enviar los contenidos de la consulta de selección, y no hay opciones de formato como la salida al estilo CSV. – CMCDragonkai

Respuesta

43

Del manual: la 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, 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 
2

Re: SELECT * INTO OUTFILE

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

+0

OUTFILE debe escribir en el servidor del cliente, que es diferente del servidor en el que está alojada la base de datos. – ThinkCode

+3

Los documentos de MySQL (http://dev.mysql.com/doc/refman/5.0/en/select.html) definen la ubicación de OUTFILE. Establece: "El archivo se crea en el host del servidor, por lo que debe tener el privilegio FILE para usar esta sintaxis. File_name no puede ser un archivo existente, lo que impide archivos como/etc/passwd y tablas de bases de datos destruido. " Entonces, verificaría si MySQL tiene permisos para escribir un archivo en el directorio OUTFILE en el servidor. No sé por qué no hay una versión de "OUTFILE LOCAL". Si necesita exportar localmente, una opción que muchas personas usan es phpMyAdmin. – Snowcrash

+0

Me acabas de salvar una publicación poco clara. – octopusgrabbus

5

La ruta que da a LOAD DATA INFILE corresponde al sistema de archivos de la máquina donde se ejecuta el servidor, no a 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 leer todo 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 difícil de hacer a través de 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.

+1

CARGAR DATOS funciona bien pero volcar el archivo mientras sea posible en el servidor en el que está alojado el DB, no es posible volcar el archivo al cliente que está en un servidor diferente. – ThinkCode

+1

mysqldump y mysql -e swtich opción ambos no alcanzan el resultado deseado. mysqldump volca toda la tabla db/y no podemos volcar solo algunas columnas en función de una condición. mysql -e swtich vuelca el archivo al formato .txt y la salida de la tubería no se puede lograr. – ThinkCode

5

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

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 si fueras wanti ng.

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

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

2

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