jueves, 5 de febrero de 2015

MYSQL --> LOAD DATA INFILE produce como resultado FILE NOT FOUND aún con la certeza de que existe el archivo

Recientes versiones del Ubuntu Server (desde la 10.04) se empaquetan con AppArmor y MySQL's en modo enforcing por defecto. Puede chequear esto ejecutando:sudo aa-status obteniendo un resultado aproximado a esto:
# 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 enforce, entonces esto es lo que puede producir este resultado tanto para lectura como escritura. Lo que puedes hacer es editar:

nano/etc/apparmor.d/usr.sbin.mysqld y añadir /ruta-de-carpeta/ and /ruta-de-carpeta/* al final del todo como muestra el ejemplo a continuación:
...
/usr/sbin/mysqld {
    ...
    /var/log/mysql/ r,
    /var/log/mysql/* rw,
    /var/run/mysqld/mysqld.pid w,
    /var/run/mysqld/mysqld.sock w,
    /ruta-de-carpeta/ r,
    /ruta-de-carpeta/* rw,

}
Después de esto tienes que recargar los perfiles del AppArmor con:.
# sudo /etc/init.d/apparmor reload
CUIDADO: este cambio propuesto permitirá a MySQL leer y escribir en la ruta incluida del directorio. Valora las implicaciones de seguridad que esto conlleva en tu caso concreto.