Corrección "No se puede encontrar el file: … (errno: 13)" en mysql

He estado golpeando mi cabeza contra esta por unos días. Tenemos un valor de dos semanas de instantáneas de copy de security diarias de nuestra producción mysql data dir (es decir, los files binarys reales, no los volcados sql) y tengo que restaurar una tabla de una de las copys de security para poder compararlo con lo que tenemos ahora .

Así que creé un directory de esquema ficticio y extraí los files de tabla relevantes (.MYI, .MYD y .frm) y reinició mysql. Se muestra, puedo "mostrar tables", pero si trato de interactuar con ella de alguna manera ("desc tablename", "select …", etc) me sale:

  No se puede encontrar el file: './schema_name/table_name.frm' (errno: 13) 

[ed: nombres reales desinfectados]

Errno 13 es permissions, así que he comprobado todo. El directory y los files tienen el mismo propietario y grupo (mysql: mysql) que todos los demás esquemas. También tienen los mismos permissions (700 en el directory, 660 en los files). Mirando "ls -n" los uids también coinciden exactamente.

Más recientemente he intentado hacer un extracto completo de una copy de security diferente y luego vincularlo en el directory de datos mysql (no hay suficiente espacio en ese volumen para extraer la cosa completa) y me sale el mismo error. También he intentado señalar el directory de datos de mysql en my.cnf al directory que sostiene la copy de security y reiniciar. Construyó las tablas de mysql que necesitaron estar allí pero todavía conseguí el mismo error.

Lo único que puedo encontrar a través de google es la gente que tenía este problema debido a la propiedad real o errores de permiso, que no parece ser el caso para mí. También he encontrado algunas observaciones al pasar sobre una variable UMASK env que puede resultar en este error, pero creo que tiene que ver con nuevas instalaciones, que no es así.

¿Estás ejecutando algo como selinux o algún otro package similar? Sugiero deshabilitar eso (o modificar las políticas de security) para ver si algo está impidiendo que MySQL pueda tener acceso a los files.

[edit] Si es así, compruebe syslog para ver si selinux está bloqueando mysql de hacer cualquier cosa. Si es SELinux, me dicen que esto puede desactivarlo para que pueda probar esta teoría.

/usr/sbin/setenforce Permissive 

strace es tu amigo en este caso. Encuentre el id de process de su mysql y luego ejecute:

  strace -efile -f -o /tmp/mysql.log -p $ pid 

En otra window haga algo que cause el error. A continuación, puede pulsar ctrl-c para matar strace. Si miras en /tmp/mysql.log deberías ver qué causó el problema.

Como un aparte, te recomiendo que no confíes en copyr los files binarys de datos. Los volcados de SQL son mucho más confiables y flexibles. Además, parecería que está usando MyISAM. Realmente recomiendo en contra de usarlos a less que no se preocupan por los datos en ellos. InnoDB tiene tantas ventajas sobre MyISAM.

Recientemente tuve este problema y resolví esto cambiando el permiso de directory de database de todos los del directory de database ubicado en /var/lib/mysql como esto:

 PWD: /var/lib/mysql chmod u+x schema_db1 chmod u+x schema_db2 chmod u+x schema_db3 chmod u+x schema_db4 

¡Reinicie el motor MySQL y vuelva a funcionar! Espero que esto podría funcionar esto para usted.

Cuando he corrido en este problema antes, era porque los files no eran poseídos por el usuario de mysql, sin importar sus permissions. chmod 777 no es realmente algo que desea estar ejecutándose en un directory de datos editado por un server de todos modos.

Compruebe cuál es el nombre de usuario configurado en /etc/my.cnf

 [mysqld] bind-address=<IP Address> datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=<username> 

Podría ser root o que haya configurado. He modificado a la raíz y comenzó a trabajar para mí.

A continuación, inicie mysql

 service mysqld stop service mysqld start