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
in
tiene 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. Sugs
usuario también debe tener elFILE
privilegio mysql para ejecutar realmente esa consulta.SELECT
permisos. A menudo busco en la base de datos como este usuario.FILE
privilegios 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 OUTFILE
a / 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-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
exit
service mysql restart
fuente
SHOW GRANTS
. Parece que el usuario de la base de datos debería tener los permisos adecuados.GRANT ALL PRIVILEGES ON *.*
, al igual queRELOAD
ySHUTDOWN
. Esto es así porque esos son privilegios administrativos globales. ElGRANT ALL
privilegio que tiene es solo para lags
base 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
/tmp
directorio. 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
sed
o 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.tsv
fuente
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
--xml
opción enmysqldump
permite exportar los datos en formato XML que luego podría analizarse mediante un script personalizado a cualquier formato necesario, incluido TSV.fuente