with variable the statement secure running query priv outfile into ejemplo column cannot mysql sql into-outfile

variable - ¿Cómo puedo evitar MySQL Errcode 13 con SELECT INTO OUTFILE?



select into mysql (13)

¿Qué versión particular de Ubuntu es esta y es esta Edición Servidor Ubuntu?

Las versiones recientes de Ubuntu Server (como 10.04) que se envían con AppArmor y el perfil de MySQL pueden estar en modo obligatorio por defecto. Puede verificar esto ejecutando sudo aa-status manera:

# 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 el modo de imposición, entonces es el que probablemente niega la escritura. Las entradas también se escribirían en /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 de esta forma:

... /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 luego haga que AppArmor vuelva a cargar los perfiles.

# sudo /etc/init.d/apparmor reload

ADVERTENCIA: el cambio anterior permitirá a MySQL leer y escribir en el directorio / data. Esperamos que ya haya considerado las implicaciones de seguridad de esto.

Estoy tratando de volcar el contenido de una tabla en un archivo csv utilizando una instrucció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 donde están almacenados 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".

Extrañamente, puedo crear el archivo en / tmp, pero no en ningún otro directorio que haya probado, incluso con permisos establecidos para que el usuario mysql pueda escribir en el directorio.

Esto es MySQL 5.0.75 ejecutándose en Ubuntu.


Algunas cosas para probar:

  • ¿Está secure_file_priv variable del sistema secure_file_priv ? Si es así, todos los archivos se deben escribir en ese directorio.
  • asegúrese de que el archivo no exista: MySQL solo creará nuevos archivos, no sobrescribirá los existentes.

Debe proporcionar una ruta absoluta, no una ruta relativa.

Proporcione la ruta completa al directorio / data en el que está intentando escribir.


En mi caso, la solución fue hacer que todos los directorios en la ruta del directorio fueran legibles y accesibles por mysql ( chmod a+rx ). El directorio todavía estaba especificado por su ruta relativa en la línea de comando.

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


Este problema me ha estado molestando por 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 al hacer que TODOS los directorios sean legibles y accesibles por mysql. Por ejemplo, si crea un directorio / tmp, los dos comandos siguientes hacen que SELECT INTO OUTFILE pueda generar el archivo .sql AND .sql

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

Si crea un directorio en su directorio principal / home / tom, debe hacer esto para / home y / home / tom.


Me encontré con este mismo problema. Mi problema era que el directorio en el que intentaba ingresar no tenía permiso de escritura para el proceso de mysqld. El volcado inicial de sql se escribiría pero la escritura del archivo 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. Entonces, el directorio necesita permisos de escritura para ambos usuarios.


MySQL se está poniendo estúpido aquí. Intenta crear archivos en / tmp / data / .... Entonces, lo que puede hacer es lo siguiente:

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

Luego prueba tu consulta. Esto funcionó para mí después de horas de depurar el problema.


Puedes hacerlo :

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


Sé que dijiste que trataste de establecer los permisos en 777, pero como tengo evidencia de que para mí fue un problema de permiso, estoy publicando lo que exactamente corrí esperando 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 $


Tengo el mismo problema y solucioné este problema siguiendo los pasos:

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

Ejecute el siguiente comando en el terminal y edite este archivo usando el editor gedit para agregar su directorio al archivo de salida.

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

  • ahora el archivo se abrirá en el editor, por favor agregue su directorio allí

    / var / www / csv / * rw,

  • asimismo, he agregado en mi archivo, como sigue la imagen dada:

Ejecute el siguiente comando para reiniciar servicios:

sudo /etc/init.d/apparmor restart

Por ejemplo, ejecuto la siguiente consulta en phpmyadmin query builder para generar datos en un archivo csv

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

Se realizó con éxito y escribir todas las filas con columnas seleccionadas en el archivo OUTPUT.csv ...


Tuve el mismo problema en un CentOs 6.7 En mi caso, se establecieron todos los permisos y aún se produjo el error. El problema era que el SE Linux estaba en el modo de "hacer cumplir".

Lo sudo setenforce 0 a "permisivo" usando el comando sudo setenforce 0

Entonces todo funcionó para mí.


Ubuntu usa AppArmor y eso es lo que le impide acceder / 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 / do the following:

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

agregue esta línea en cualquier lugar de la lista de directorios:

/data/ rw,

luego haz a:

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 te olvides de reiniciar apparmor:

sudo /etc/init.d/apparmor restart


Ubuntu usa SELinux? Verifique si está habilitado y se aplica. /var/log/audit/audit.log puede ser de ayuda (si es ahí donde lo pega Ubuntu, esa es la ubicación de RHEL / Fedora).