"Impossible de trouver le fichier mysql / plugin.frm" lors du démarrage de MySQL

17

Lorsque je démarre mon serveur MySQL, j'obtiens cette erreur:

/usr/libexec/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'create'.
InnoDB: Cannot continue operation.

J'ai couru mysql_upgradepour le reconstruire, et cela fonctionne pour le reconstruire. Avant cela, j'ai supprimé et installé MySQL. Cependant, lorsque j'ai essayé de redémarrer, j'obtiens la même erreur. Je suis sûr que ce n'est pas un problème d'autorisation, car tous les fichiers et répertoires sont créés par l' mysqlutilisateur.

Pourriez-vous me conseiller sur la façon de corriger cette erreur?

amacleod
la source
selinux peut également provoquer ce problème.
Ross

Réponses:

16

Si vous avez un répertoire de données mysql à un emplacement non standard et que votre système a un apparmor, assurez-vous que /etc/apparmor.d/usr.sbin.mysqldvotre répertoire de données est sur la liste blanche. La configuration devrait ressembler à:

/mysql/data/dir/ r, #trailing slash is mandatory
/mysql/data/dir/** rwk,

Le démon Apparmor doit être redémarré après avoir apporté des modifications à la configuration.

xyzman
la source
1
apparmorrevient pour nous réveiller de temps en temps, juste pour ne pas l'oublier ...
Ring Ø
1
Hou la la! beaucoup de temps à chercher cette réponse. Merci!
Diego Andrés Díaz Espinoza
Dans mon cas, j'utilise également un répertoire temporaire personnalisé, et j'ai trouvé que je devais imiter certaines lignes de /etc/apparmor.d/abstractions/user-tmp. Quand je mets owner /mysql-tmp/** rwkl, /mysql-tmp/ r,en /etc/apparmor.d/local/usr.sbin.mysqldelle a commencé à travailler pour moi sur Ubuntu 14.04.
amacleod
12

Êtes-vous sûr qu'il ne s'agit pas d'autorisations? errno: 13 :

$ perror 13
OS error code  13:  Permission denied

La première chose à essayer est de changer la propriété du datadir de MySQL , par exemple, si vous exécutez MySQL avec l'utilisateur mysql :

chown -R mysql:mysql /path/to/datadir

Une autre chose à vérifier est de savoir si le propriétaire du processus mysqld (très probablement mysql ) a les privilèges nécessaires pour la destination définie comme tmpdir . Et si, pour une raison quelconque, ce qui précède ne fonctionne pas, essayez de suivre le processus mysqld pour voir où et pourquoi sa permission est refusée :

strace -fp$(/sbin/pidof mysqld) -o /tmp/my_trace.log
Dimitre Radoulov
la source
J'ai rencontré le même problème lors de la mise à niveau de MySQL 5.1 vers 5.7. Il semble que l'utilisateur mysql ait perdu la propriété du répertoire / var / lib / mysql .
Rob
1

Je suis d'accord avec Dimitre. Ce problème survient principalement en raison d'autorisations insuffisantes. Changez la propriété du dossier racine MySql en mysql.

chown -R mysql:mysql [mysql root folder]

Vous voudrez peut-être changer l'autorisation des scripts Mysql pour votre utilisateur personnalisé.

chown my_mysql:my_mysql [mysqld etc]

Cela a fonctionné pour moi.

Muneeb Mirza
la source
1

Dans mon cas, je devais placer le répertoire de données MySQL, y compris le ibdata1dossier, dans un autre partitionnement, car ma ibdata1croissance était trop rapide et un problème de mémoire s'est produit. Pour cela, j'ai dû changer mon fichier.cnf comme ci-dessous.

mon.cnf était:

datadir         =  /var/lib/mysql

my.cnf maintenant:

datadir         = /home/ubuntu/data/mysql

J'ai essayé,

sudo chown -R mysql:mysql  /home/ubuntu/data/mysql

mais toujours la même erreur ci-dessus. Ensuite, j'ai essayé de changer le /etc/apparmor.d/usr.sbin.mysqldfichier. Ça a bien marché pour moi.

Nous devrions ajouter notre nouveau dossier à la liste blanche usr.sbin.mysqld.

 # /var/lib/mysql/ r,
 #/var/lib/mysql/** rwk,

Au lieu des lignes ci-dessus, ajoutez:

 /home/ubuntu/data/mysql/ r,
 /home/ubuntu/data/mysql/** rwk,

Redémarrez ensuite le serveur MySQL.

Sithara
la source
1

Si vous utilisez SELinux, les éléments suivants peuvent également vous aider ...

 $ -> ls -lZa
 $ -> chcon -R -v -u system_u -t mysqld_db_t /var/lib/mysql
 $ -> ls -lZa
Mike Purcell
la source
Pour moi, cela a restorecon -R /var/lib/mysqlaidé à restaurer correctement les paramètres SELinux pour le répertoire.
Sebi
0

J'ai eu ce problème après avoir mis à niveau la version 5.5 vers la version 5.6.

Étrangement, il semblait que l' mysqlutilisateur avait été supprimé et recréé, ce qui avait fait que tous les fichiers mysql avaient essentiellement `` perdu '' leurs autorisations ...

J'ai découvert cela en allant dans le répertoire mysql (qui dans mon cas n'était pas le répertoire par défaut, car je l'ai déplacé) et j'ai vu que le propriétaire était juste un numéro uuid et guid ... Donc, je viens de courir chown mysql:mysqlsur tous les dirs et fichiers, et le tour est joué

Just Lucky Really
la source
-1

Ce simple chowna également fonctionné pour moi, plus de processus de plantage:

sudo chown -R mysql:mysql  /var/lib/mysql

Heureusement, jouer avec apparmor devient compliqué et difficile à modifier.

tomthumb99
la source