MySQL - SELECT * INTO OUTFILE local?
-
01-10-2019 - |
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?
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.