Estoy tratando de enviar los datos de una tabla MySQL a un archivo pero obtengo errores de permiso:
$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>
Si el directorio en cuestión está modificado para 777, ¿por qué el usuario de MySQL no puede escribir el archivo? Curiosamente, tampoco puedo escribir en / tmp /.
EDITAR: Parece que el usuario de la base de datos tiene los permisos adecuados de MySQL:
mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword' |
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost' |
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)
mysql
linux
permissions
dotancohen
fuente
fuente

intiene sentido si MySQL no puede accederdotanchoen. En otras palabras, la caja de depósito de seguridad en la bóveda del banco se puede dejar abierta de par en par, pero si la puerta de la bóveda del banco está cerrada, no entrará en la caja. Sugsusuario también debe tener elFILEprivilegio mysql para ejecutar realmente esa consulta.SELECTpermisos. A menudo busco en la base de datos como este usuario.FILEprivilegios tal como lo describen los documentos de MySQL .Respuestas:
De acuerdo con la documentación de MySQL en SELECT ... INTO OUTFILE
Debería enviar
SELECT INTO OUTFILEa / var / lib / mysql de la siguiente maneraPor supuesto, debe asegurarse de tener permiso de ARCHIVO en gs @ localhost.
Hay dos formas de obtener este permiso
MÉTODO 1
MÉTODO # 2
ACTUALIZACIÓN 2012-05-01 07:09 EDT
Para darse el privilegio de ARCHIVO, haga lo siguiente:
service mysql restart --skip-networking --skip-grant-tablesmysql <hit enter>UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';exitservice mysql restartfuente
SHOW GRANTS. Parece que el usuario de la base de datos debería tener los permisos adecuados.GRANT ALL PRIVILEGES ON *.*, al igual queRELOADySHUTDOWN. Esto es así porque esos son privilegios administrativos globales. ElGRANT ALLprivilegio que tiene es solo para lagsbase de datos.Las diferentes distribuciones y sistemas operativos no manejan todos los destinos de OUTFILE de la misma manera.
Por ejemplo, cuando se ejecuta un demonio mysqld en Linux, que usa un socket, el archivo OUTFILE a veces se escribe en el
/tmpdirectorio. No es un gran problema, solo usar el enfoque OUTFILE tiene deficiencias, es decir, tratar con los permisos y encontrar a dónde fue el archivo.Dado que el objetivo de esta pregunta no es específicamente "Cómo usar un OUTFILE", sino que solo está buscando capturar algunos datos de MySQL en un archivo, aquí hay una alternativa que no requiere que juegue con permisos de ARCHIVO, etc. .
El resultado de esto está delimitado por tabulaciones de forma predeterminada. Para las comas, simplemente canalícelo
sedo algo antes de escribirlo en el archivo.fuente
Pasé horas tratando de entender las sugerencias en esta página y en muchas otras páginas de StackOverflow.
No importa cómo cambié los permisos en MySql, no pude hacer que nada funcionara.
Volví a los permisos con los que comencé.
Finalmente, lo que funcionó para mí fue más simple que las sugerencias de otros:
echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsvfuente
Con respecto a los dos métodos para enviar datos a CSV (debería ser TSV) mencionados anteriormente, he encontrado que si hay valores vacíos en las entradas que está exportando, existe el riesgo de que los datos se puedan desordenar debido a una asignación incorrecta de los datos a las columnas correspondientes.
Con preocupación por la integridad de los datos para la recuperación, encontré este sitio web:
https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/
Mencionó que la
--xmlopción enmysqldumppermite exportar los datos en formato XML que luego podría analizarse mediante un script personalizado a cualquier formato necesario, incluido TSV.fuente