miércoles, 16 de julio de 2014

MySQL, Ubuntu :: mysqld no tiene los derechos de acceso

Original post: http://anothermysqldba.blogspot.com/2014/07/mysql-ubuntu-mysqld-does-not-have.html

Así que hoy se me ocurre que tenga que restaurar una base de datos MySQL desde copias de seguridad para que pudiera recuperar algunas mesas. Mientras que dejé que la base de datos de producción funcionando a través del puerto 3306, he creado la copia de seguridad a través del puerto 3307. 

Sin embargo, cuando traté de iniciar otra versión a través del puerto 3307 en un directorio mysql_restore pero me encontré con algunos errores .... 


/usr/bin/mysqld_safe --defaults-file=/etc/my_3307.cnf 

[Warning] Can't create test file /var/lib/mysql_restore/localhost.lower-test 
[Warning] Can't create test file /var/lib/mysql_restore/localhost.lower-test 
Can't find file: './mysql/plugin.frm' (errno: 13) 

InnoDB: Completed initialization of buffer pool 
InnoDB: Operating system error number 13 in a file operation. 
InnoDB: The error means mysqld does not have the access rights to 
InnoDB: the directory. 
InnoDB: File name ./ibdata1 
InnoDB: File operation call: 'open'. 
InnoDB: Cannot continue operation. 

# perror 13 
OS error code 13: Permission denied 


Así que me registré los permisos en el directorio, aseguró que se establece en 700 y es propiedad de mysql. También me aseguré de que los directorios dentro del directorio de datos se establece en 700 y son propiedad de mysql. El resto de los archivos todo listo al 600 (-rw-rw ----). Sólo para estar seguro también me aseguré de que el disco no estaba lleno. 

Así que el registro de errores muestra problemas de permisos, pero a primera vista todos los permisos sean correctos. Entonces, ¿qué es? 

Bueno, si yo estaba en RHEL o ramas afines, pensaría de SELinux. ¿Fue bloqueando de alguna manera. 
El Ubuntu Apparmor necesitaba ser revisado en este caso. 


# cat /etc/apparmor.d/usr.sbin.mysqld 
... 
/var/lib/mysql/ r, 
/var/lib/mysql/** rwk, 
... 


Observe que el valor predeterminado "var / lib / mysql" se está abordando. El directorio de restauración que he creado no era sin embargo. Así que mediante la adición de eso y un reinicio del apparmor Yo era entonces capaz de iniciar correctamente MySQL. 


# vi /etc/apparmor.d/usr.sbin.mysqld 
... 
/var/lib/mysql/ r, 
/var/lib/mysql/** rwk, 
/var/lib/mysql_restore/ r, 
/var/lib/mysql_restore/** rwk, 
... 
/etc/init.d/apparmor {start|stop|restart|reload|force-reload|status|recache} 
/var/lib/mysql_restore# /etc/init.d/apparmor restart 
... 
/usr/bin/mysqld_safe --defaults-file=/etc/my_3307.cnf 
... 
# mysql -P 3307 --socket=/var/lib/mysql_restore/mysqld_3307.sock 



URLs adicionales para la revisión si es necesario: