Can’t find file: ‘./mysql/plugin.frm’

By | 17 août 2013

Je travaille habituellement sur des machines Debian, et je n’avais jamais rencontré cette erreur jusqu’à aujourd’hui en aidant un collègue dans la mise en place de l’outil Xtrabackup de Percona. Pour ceux qui ne connaissent pas XtraBackup, je vous renvoie vers cet article XtraBackup.

Pour résumé, nous effectuons nos backup physique via XtraBackup sur notre master, pour les remonter ensuite sur notre slave, mais cette fois ci le slave n’est pas reparti …

Voici l’erreur:
130917 16:14:35 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
/usr/libexec/mysqld: Can’t find file: ‘./mysql/plugin.frm’ (errno: 13)
130917 16:14:35 [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.
130917 16:14:35 [ERROR] /usr/libexec/mysqld: Can’t find file: ‘./mysql/host.frm’ (errno: 13)
130917 16:14:35 [ERROR] Fatal error: Can’t open and lock privilege tables: Can’t find file: ‘./mysql/host.frm’ (errno: 13)
130917 16:14:35 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended

Imcompréhensible, étant donnée que le fichier existe bien, il a les bons droits et appartient bien à l’utilisateur mysql. Je fais donc quelques recherches sur mon ami Google et tombe rapidement sur ce sujet => http://forums.mysql.com/read.php?11,373216,373216#msg-373216. Afin de vous éviter la lecture entière du sujet, la solution proposée est de modifier le datadir en le faisant pointer vers /var/lib/mysql/mysql.

Perplexe, je teste tout de même, et ça fonctionne, enfin à moitié car considéré par MySQL comme une nouvelle installation …

En tout cas il m’a permis d’identifier d’où venait le soucis. Je teste plusieurs choses, modification des droits, modification du propriétaire, changement du datadir … Pour finalement m’apercevoir que SELinux était actif, et protégeait le dossier datadir de MySQL …

La solution est donc toute simple, désactiver SELinux immédiatement via la commande echo 0 >/selinux/enforce et de manière permanente en modifiant la directive SELINUX=enforcing par SELINUX=disabled dans le fichier /etc/selinux/config.

Si vous rencontrez ce même soucis sur une machine Ubuntu c’est du côté de AppArmor que vous allez devoir chercher.