Pregunta

Estoy tratando de volcar el contenido de una tabla a un archivo CSV con una declaración de MySQL SELECT INTO OUTFILE. Si hago:

SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

outfile.csv se crea en el servidor en el mismo directorio de archivos de esta base de datos se almacenan en.

Sin embargo, cuando cambio mi consulta a:

SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

Puedo obtener:

ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)

Errcode 13 es un error de permisos, pero lo entiendo, incluso si el cambio que la propiedad de los datos a / MySQL: MySQL y darle permisos 777. MySQL se está ejecutando como usuario "mysql".

Por extraño que pueda crear el archivo en / tmp, pero no en cualquier otro directorio que he intentado, incluso con permisos establecen de tal manera que MySQL usuario debería poder escribir en el directorio.

Este es MySQL 5.0.75 corriendo en Ubuntu.

¿Fue útil?

Solución

¿Qué versión particular de Ubuntu es esto y es este Ubuntu Server Edition?

últimas ediciones de Ubuntu Server (por ejemplo, 10,04) se envían con el perfil de AppArmor y de MySQL podría ser en modo obligatorio por defecto. Esto se puede comprobar mediante la ejecución de sudo aa-status este modo:

# sudo aa-status
5 profiles are loaded.
5 profiles are in enforce mode.
   /usr/lib/connman/scripts/dhclient-script
   /sbin/dhclient3
   /usr/sbin/tcpdump
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/sbin/mysqld
0 profiles are in complain mode.
1 processes have profiles defined.
1 processes are in enforce mode :
   /usr/sbin/mysqld (1089)
0 processes are in complain mode.

Si mysqld está incluido en modo de aplicación, entonces es probable que el negar la escritura. Las entradas también se pueden escribir en /var/log/messages cuando AppArmor bloquea los escribe / accesos. Lo que puede hacer es editar /etc/apparmor.d/usr.sbin.mysqld y /data/ complemento y /data/* cerca de la parte inferior de esta manera:

...  
/usr/sbin/mysqld  {  
    ...  
    /var/log/mysql/ r,  
    /var/log/mysql/* rw,  
    /var/run/mysqld/mysqld.pid w,  
    /var/run/mysqld/mysqld.sock w,  
    **/data/ r,  
    /data/* rw,**  
}

Y a continuación, hacer AppArmor vuelva a cargar los perfiles.

# sudo /etc/init.d/apparmor reload

ADVERTENCIA: el cambio anterior permitirá MySQL para leer y escribir en el directorio / datos. Esperamos que ya ha considerado las implicaciones de seguridad de este.

Otros consejos

Ubuntu usa AppArmor y que es cuál es lo que impide el acceso a / data /. Fedora usa SELinux y que impediría esto en una máquina de RHEL / Fedora / CentOS.

Para modificar AppArmor para permitir acceso a MySQL / datos / hacer lo siguiente:

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

añadir esta línea en cualquier lugar en la lista de directorios:

/data/ rw,

luego hacer un:

sudo /etc/init.d/apparmor restart

Otra opción es AppArmor desactivar por completo para MySQL, esto es NO RECOMENDADO

sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

No se olvide de reiniciar apparmor:

sudo /etc/init.d/apparmor restart

Sé que dijo que ya ha probado la configuración de permisos a 777, pero como tengo una evidencia de que para mí fue un problema de permisos les dejo lo que exactamente correr con la esperanza de que pueda ayudar. Aquí está mi experiencia:

tmp $ pwd
/Users/username/tmp
tmp $ mkdir bkptest
tmp $ mysqldump -u root -T bkptest bkptest
mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
tmp $ chmod a+rwx bkptest/
tmp $ mysqldump -u root -T bkptest bkptest
tmp $ ls bkptest/
people.sql  people.txt
tmp $ 

MySQL es cada vez estúpida aquí. Se trata de crear archivos en / tmp / datos / .... Así que lo que puede hacer es la siguiente:

mkdir /tmp/data
mount --bind /data /tmp/data

A continuación, probar su consulta. Esto funcionó para mí después de horas de depurar el problema.

Este problema me ha estado molestando desde hace mucho tiempo. Me di cuenta de que esta discusión no señala la solución en RHEL / Fecora. Estoy utilizando RHEL y no encuentro los archivos de configuración correspondientes a AppArmer en Ubuntu, pero he resuelto mi problema haciendo cada directorio en el directorio del PATH legible y accesible por MySQL. Por ejemplo, si crea un directorio / tmp, los siguientes dos comandos hacen SELECT INTO OUTFILE capaz de emitir la .sql y el archivo .sql

chown mysql:mysql /tmp
chmod a+rx /tmp

Si crea un directorio en su directorio / home / tom, debe hacer lo mismo para / home y / home / tom.

Usted puede hacer esto:

mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml

Algunas cosas para probar:

  • es el secure_file_priv conjunto variable de sistema? Si es así, todos los archivos deben ser escritos a ese directorio.
  • Asegúrese de que el archivo no existe -. MySQL sólo creará nuevos archivos, no los sobrescribir existente

Tengo mismo problema y me fijo este problema siguiendo estos pasos:

  • Sistema operativo: Ubuntu 12.04
  • lámpara instalada
  • supongamos que el directorio para guardar el archivo de salida es: / var / www / csv /

Ejecutar siguiente comando en el terminal y editar este archivo usando el editor gedit añadir su directorio para el archivo de salida.

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

  • Ahora el archivo se abre en el editor favor agregue su directorio existe

    / var / www / csv / RW *,

  • Del mismo modo he añadido en mi archivo, de la siguiente imagen dada:

introducir descripción de la imagen aquí

Ejecutar siguiente comando para reiniciar los servicios:

sudo /etc/init.d/apparmor reinicio

Por ejemplo ejecuto siguiente consulta en el generador de consultas phpmyadmin a los datos de salida en el archivo csv

SELECT colName1, colName2,colName3
INTO OUTFILE '/var/www/csv/OUTFILE.csv'
FIELDS TERMINATED BY ','
FROM tableName;

Se realiza con éxito y escribir todas las filas con columnas seleccionadas en un archivo OUTPUT.CSV ...

En mi caso, la solución era hacer que cada directorio en la ruta del directorio legible y accesible por mysql (chmod a+rx). El directorio todavía se especificó por su ruta relativa en la línea de comandos.

chmod a+rx /tmp
chmod a+rx /tmp/migration
etc.

Me acabo de encontrar con el mismo problema. Mi problema era el directorio que yo estaba tratando de volcar en no tiene permiso de escritura para el proceso mysqld. El volcado SQL inicial escribiría a cabo pero la escritura del csv / txt fallaría. Parece que el volcado SQL se ejecuta como el usuario actual y la conversión a csv / txt se ejecuta como el usuario que ejecuta mysqld. Por lo que las necesidades de directorio permisos de escritura para los usuarios.

Es necesario proporcionar una ruta absoluta, no una ruta relativa.

proporcionar la ruta completa al directorio / datos que está intentando escribir en.

el uso de SELinux

¿El Ubuntu? Comprobar para ver si está habilitado y hacer cumplir. /var/log/audit/audit.log puede haber very helpul (si es allí donde se pega Ubuntu - que es la ubicación de RHEL / Fedora).

Yo tenía el mismo problema en un CentOs 6.7 En mi caso todos los permisos se establecieron y todavía ocurrió el error. El problema era que la SE Linux estaba en el modo de "hacer cumplir".

Me cambié a "permisiva" con el comando sudo setenforce 0

A continuación, todo salió bien para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top