Estoy tratando de volcar el contenido de una tabla en un archivo csv usando una declaración MySQL SELECT INTO OUTFILE. Si lo hago:
SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
outfile.csv se creará en el servidor en el mismo directorio en el que se almacenan los archivos de esta base de datos.
Sin embargo, cuando cambio mi consulta a:
SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Yo obtengo:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)
Errcode 13 es un error de permisos, pero lo obtengo incluso si cambio la propiedad de / data a mysql: mysql y le doy 777 permisos. MySQL se ejecuta como usuario "mysql".
Curiosamente, puedo crear el archivo en / tmp, pero no en ningún otro directorio que haya probado, incluso con los permisos establecidos de manera que el usuario mysql debería poder escribir en el directorio.
Este es MySQL 5.0.75 ejecutándose en Ubuntu.
mysql
sql
into-outfile
Ryan Olson
fuente
fuente
/tmp
.Respuestas:
¿Qué versión particular de Ubuntu es esta y es esta Ubuntu Server Edition?
Las ediciones recientes de Ubuntu Server (como 10.04) se envían con AppArmor y el perfil de MySQL puede estar en modo obligatorio de forma predeterminada. Puede verificar esto ejecutando
sudo aa-status
así:Si mysqld está incluido en el modo de imposición, probablemente sea el que niegue la escritura. Las entradas también se escribirán
/var/log/messages
cuando AppArmor bloquee las escrituras / accesos. Lo que puede hacer es editar/etc/apparmor.d/usr.sbin.mysqld
y agregar/data/
y/data/*
cerca de la parte inferior así:Y luego haga que AppArmor vuelva a cargar los perfiles.
ADVERTENCIA: el cambio anterior permitirá que MySQL lea y escriba en el directorio / data. Esperamos que ya haya considerado las implicaciones de seguridad de esto.
fuente
/your/abs/folder/ r, /your/abs/folder/** rwk, }
¡no olvides incluir la coma al final!Ubuntu usa AppArmor y eso es lo que le impide acceder a / data /. Fedora usa selinux y eso evitaría esto en una máquina RHEL / Fedora / CentOS.
Para modificar AppArmor para permitir que MySQL acceda a / data / haga lo siguiente:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
agregue esta línea en cualquier lugar de la lista de directorios:
/data/ rw,
luego haz un:
sudo /etc/init.d/apparmor restart
Otra opción es deshabilitar AppArmor para mysql por completo, esto NO SE RECOMIENDA :
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
No olvide reiniciar apparmor:
sudo /etc/init.d/apparmor restart
fuente
Sé que dijiste que ya trataste de configurar los permisos en 777, pero como tengo evidencia de que para mí fue un problema de permisos, estoy publicando lo que ejecuto exactamente con la esperanza de que pueda ayudar. Esta es mi experiencia:
fuente
MySQL se está volviendo estúpido aquí. Intenta crear archivos en / tmp / data / .... Entonces, lo que puede hacer es lo siguiente:
Entonces prueba tu consulta. Esto funcionó para mí después de horas de depurar el problema.
fuente
Este problema me ha estado molestando durante mucho tiempo. Noté que esta discusión no señala la solución en RHEL / Fecora. Estoy usando RHEL y no encuentro los archivos de configuración correspondientes a AppArmer en Ubuntu, pero resolví mi problema haciendo que CADA directorio en el directorio PATH sea legible y accesible por mysql. Por ejemplo, si crea un directorio / tmp, los dos comandos siguientes hacen que SELECT INTO OUTFILE pueda generar el archivo .sql Y .sql
Si crea un directorio en su directorio personal / home / tom, debe hacerlo tanto para / home como para / home / tom.
fuente
chown mysql:mysql
resolver mi problemaPuedes hacerlo :
fuente
Algunas cosas para probar:
secure_file_priv
configurada la variable del sistema? Si es así, todos los archivos deben escribirse en ese directorio.fuente
Tengo el mismo problema y solucioné este problema siguiendo los pasos:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
ahora el archivo se abrirá en el editor, agregue su directorio allí
/ var / www / csv / * rw,
Asimismo, he agregado en mi archivo, como la siguiente imagen dada:
sudo /etc/init.d/apparmor reiniciar
Se hizo con éxito y escribió todas las filas con columnas seleccionadas en el archivo OUTPUT.csv ...
fuente
En mi caso, la solución fue hacer que cada directorio en la ruta del directorio fuera legible y accesible por
mysql
(chmod a+rx
). El directorio todavía estaba especificado por su ruta relativa en la línea de comando.fuente
Me encontré con el mismo problema. Mi problema fue que el directorio en el que estaba tratando de volcar no tenía permiso de escritura para el proceso mysqld. El volcado de sql inicial se escribiría, pero la escritura del archivo csv / txt fallaría. Parece que el volcado de sql se ejecuta como el usuario actual y la conversión a csv / txt se ejecuta como el usuario que está ejecutando mysqld. Entonces, el directorio necesita permisos de escritura para ambos usuarios.
fuente
Debe proporcionar una ruta absoluta, no una ruta relativa.
Proporcione la ruta completa al directorio / data en el que está intentando escribir.
fuente
touch /data/outfile.csv
su --shell=/bin/sh nameofaccount
¿Ubuntu usa SELinux? Verifique si está habilitado y cumpliendo. /var/log/audit/audit.log puede ser útil (si ahí es donde Ubuntu lo pega, esa es la ubicación de RHEL / Fedora).
fuente
Tuve el mismo problema en CentOs 6.7. En mi caso, se establecieron todos los permisos y aún así se produjo el error. El problema era que el SE Linux estaba en modo "imponiendo".
Lo cambié a "permisivo" usando el comando
sudo setenforce 0
Entonces todo salió bien para mí.
fuente