无法创建文件 /var/lib/mysql/user.lower-test

Mic*_*ohn 16 mysql linux

MySQL 数据库几个月来一直没有问题。今天,当我使用 Synaptic Package Manager 检查可升级的软件包时,它提出了各种 MySQL 组件(-common、-client、-server 等)。因此,我决定升级(我忘记注意安装的版本,但认为它是 5.6.21)到 5.6.25-1-ubuntu2.0。之后当我去查询数据库时,我收到了消息:-

Error occured: Can't connect to MySQL server on '127.0.0.1' (111)
Run Code Online (Sandbox Code Playgroud)

然后我发现服务器没有运行。在日志文件中,我喜欢这条消息:-

Can't create file /var/lib/mysql/user.lower-test
Run Code Online (Sandbox Code Playgroud)

我花了一个小时左右的时间在线搜索,虽然之前已经报告过这个问题,但我没有在“更新后”问题的上下文中看到它,所以不确定我的下一步。

小智 10

这个问题似乎是权限问题或将mysql数据目录更改为其他位置然后/var/lib/mysql。

尝试使用 sudo 运行

看起来 /var/lib/mysql 归 mysql 用户所有,并且该组也设置为 mysql。

$ sudo chown -R mysql /var/lib/mysql
$ sudo chgrp -R mysql /var/lib/mysql
$ sudo chmod 755 /var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

您是否检查过目录 /var/lib/mysql 确实存在并对应于您的数据目录?如果没有,那么您可能必须在 mysqld 部分下另外指定 datadir 参数

[mysqld]
datadir=/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

然后你可以选择配置 apparmor 以允许 MySQL 读取\执行\修改新的数据目录和子目录,或者你自己承担风险,你可以删除 apparmor。您可能需要以 root 身份执行以下操作:

/etc/init.d/apparmor stop
/etc/init.d/apparmor teardown
update-rc.d -f apparmor remove
apt-get purge apparmor
reboot
Run Code Online (Sandbox Code Playgroud)


小智 9

我在尝试运行 MySQL 的多个实例时遇到了这个问题,但我没有删除 apparmor,而是更新了 usr.sbin.mysqld 文件:

vim /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)

例如,这就是我的文件的样子,一旦我添加了需要写入权限的文件夹,一切都会正常工作。

/usr/sbin/mysqld {

  capability dac_override,
  capability sys_resource,
  capability setgid,
  capability setuid,

  network tcp,

  /etc/hosts.allow r,
  /etc/hosts.deny r,

  /etc/mysql/*.pem r,
  /etc/mysql/conf.d/ r,
  /etc/mysql/conf.d/* r,
  /etc/mysql/*.cnf r,
  /usr/lib/mysql/plugin/ r,
  /usr/lib/mysql/plugin/*.so* mr,
  /usr/sbin/mysqld mr,
  /usr/share/mysql/** r,
  /var/log/mysql.log rw,
  /var/log/mysql.err rw,
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /var/lib/mysql1/ r,
  /var/lib/mysql1/** rwk,
  /var/log/mysql/ r,
  /var/log/mysql/* rw,
  /var/run/mysqld/mysqld.pid rw,
  /var/run/mysqld/mysqld.sock w,
  /var/run/mysqld/mysqld1.pid rw,
  /var/run/mysqld/mysqld1.sock w,
  /run/mysqld/mysqld.pid rw,
  /run/mysqld/mysqld.sock w,

  /sys/devices/system/cpu/ r,

}
Run Code Online (Sandbox Code Playgroud)

  • 这对我也有用。我必须重新启动服务器才能使其正常工作——仅停止并重新启动 AppArmour 是行不通的。 (2认同)

小智 5

当我尝试将 /var/lib/mysql 移动到另一个磁盘并用符号链接替换原始目录时,出现了这个问题。

Apparmor 将拒绝此配置中的访问,请参阅

为什么 Apparmor 开发人员认为这不是一个错误。解决方法是使用绑定安装。看

以获得解释。

所以

mount --bind /newmysqldatadir /var/lib/mysql
service mysql start
Run Code Online (Sandbox Code Playgroud)

为我解决了这个问题。