启动MySQL时“找不到文件mysql / plugin.frm”


17

当我启动MySQL服务器时,出现以下错误:

/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.

我已经运行mysql_upgrade过重建它,并且它可以重建。在此之前,我删除并安装了MySQL。但是,当我尝试重新启动时,出现相同的错误。我确信这不是权限问题,因为所有文件和目录都是由mysql用户创建的。

您能建议我如何解决此错误吗?


selinux也可能导致此问题。
罗斯

Answers:


16

如果您的mysql数据目录位于非标准位置,并且系统具有apparmor,请确保将/etc/apparmor.d/usr.sbin.mysqld您的数据目录列入白名单。配置应如下所示:

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

对配置进行任何更改后,必须重新启动Apparmor守护程序。


1
apparmor回来时不时地唤醒我们,只是为了我们不要忘记他...
戒指Ø

1
哇!很多时间在寻找这个答案。谢谢!
迭戈·安德烈斯·迪亚斯·埃斯皮诺萨2015年

就我而言,我还使用了一个自定义的temp dir,我发现我需要模仿的某些行/etc/apparmor.d/abstractions/user-tmp。当我把owner /mysql-tmp/** rwkl, /mysql-tmp/ r,/etc/apparmor.d/local/usr.sbin.mysqld它开始为我工作在Ubuntu 14.04。
amacleod

12

您确定与权限无关吗? errno:13

$ perror 13
OS error code  13:  Permission denied

尝试做的第一件事是更改MySQL数据目录的所有权,例如,如果您使用用户mysql运行MySQL

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

要检查的另一件事是mysqld进程所有者(很可能是mysql)是否对定义为tmpdir的目标具有必要的特权。并且,如果由于上述原因而导致上述操作不起作用,请尝试跟踪mysqld进程,以查看在何处以及为什么它被拒绝了权限

strace -fp$(/sbin/pidof mysqld) -o /tmp/my_trace.log

从MySQL 5.1升级到5.7时遇到了同样的问题。用户mysql似乎失去了对/ var / lib / mysql目录的所有权。
罗布

1

我同意迪米特雷(Dimitre)的观点。出现此问题的主要原因是权限不足。将MySql根文件夹的所有权更改为mysql。

chown -R mysql:mysql [mysql root folder]

但是,您可能希望将Mysql脚本的权限更改为自定义用户。

chown my_mysql:my_mysql [mysqld etc]

这对我有用。


1

就我而言,我需要将包括ibdata1文件夹在内的MySQL数据目录放置到另一个分区中,因为我的ibdata1增长速度太快并且发生了内存问题。为此,我不得不像下面那样更改my.cnf文件。

my.cnf是:

datadir         =  /var/lib/mysql

my.cnf现在:

datadir         = /home/ubuntu/data/mysql

我试过了,

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

但仍然出现相同的上述错误。然后,我尝试更改/etc/apparmor.d/usr.sbin.mysqld文件。对我来说效果很好。

我们应该将中的新文件夹列入白名单usr.sbin.mysqld

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

除了上述几行,

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

然后重启MySQL服务器。


1

如果您正在运行SELinux,则以下内容也可能会有所帮助...

 $ -> ls -lZa
 $ -> chcon -R -v -u system_u -t mysqld_db_t /var/lib/mysql
 $ -> ls -lZa

对我来说,这样做restorecon -R /var/lib/mysql有助于正确还原目录的SELinux设置。
塞比

0

从5.5升级到5.6后,我遇到了这个问题。

奇怪的是,mysql用户似乎已被删除并重新创建,这导致所有mysql文件实质上“失去了”他们的权限...

我通过转到mysql目录(在我的情况下不是默认目录,因为我已经将其移动了)发现了这一点,并发现所有者只是一个uuid和guid号码...所以,我只是chown mysql:mysql在所有目录和文件,瞧


-1

这个简单的方法chown也对我有用,不再需要崩溃的过程:

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

值得庆幸的是,与apparmor一起玩变得复杂且难以编辑。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.