升级到 Ubuntu 16.04 后 MariaDB 无法启动

升级到 Ubuntu 16.04 后 MariaDB 无法启动

从 14.04 x64 升级到 Ubuntu 16.04

如果我尝试启动mysqld它就会失败,并且在系统日志中我有

kernel: [ 2336.792423] audit: type=1400 audit(1470265086.730:518): apparmor="DENIED" operation="sendmsg" info="Failed name lookup - disconnected path" error=-13 profile="/usr/sbin/mysqld" name="run/systemd/notify" pid=11850 comm="mysqld" requested_mask="w" denied_mask="w" fsuid=117 ouid=0

我已添加/run/systemd/notify/到 apparmor,但无法添加run/systemd/notify- 缺少“/”

我该如何解决这个问题?我需要 MariaDB 在单独的分区上运行

我正在使用 MariaDB,数据文件夹已打开,/home/db/mysql 我已配置一个符号链接指向它

lrwxrwxrwx 1 mysql mysql 14 iun 22 20:58 /var/lib/mysql -> /home/db/mysql

并且还配置了应用程序装甲配置文件:

# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>

/usr/sbin/mysqld {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/user-tmp>
#include <abstractions/mysql>
#include <abstractions/winbind>

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/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid rw,
/var/run/mysqld/mysqld.sock w,
/run/mysqld/mysqld.pid rw,
/run/mysqld/mysqld.sock w,
/run/systemd/notify w,
/home/db/** rwk,
/home/db/mysql/** rwk,

/sys/devices/system/cpu/ r,

# Site-specific additions and overrides. See local/README for details.
#include <local/usr.sbin.mysqld>
}

之前在 cd 上失败了/home/db/mysql,但通过编辑/lib/systemd/system/mariadb.service和设置修复了它ProtectHome=false

答案1

经过多次尝试,包括 apparmor 配置、编辑 /lib/systemd/system/mariadb.service/etc/mysql/my.cnf设置 datadir,均失败后,我采用了不同的方法。

  1. 停止服务(如果已启动):sudo service mysqld stop
  2. 清除安装apt-get purge mysqld*

  3. 我删除了所有涉及 mysql 和 mariadb 的内容(在 中搜索了/etc它们/var)。如果您认为将来可能需要它们作为参考,则可能需要备份它们。

    • mysql 和 mariadb 配置/etc/systemd/system

    • mysql 配置文件/etc/apparmor.d

    • 目录/etc/mysql

    • mysql我在 中的符号链接/var/lib(我的数据在 上是安全的/home/db/mysql)。如果您的数据在/var/lib/mysql

  4. 重新安装sudo apt-get install mariadb-server

  5. 重命名/var/lib/mysql/var/lib/mysql.bk并创建符号/home/db/mysql链接/var/lib/mysql
  6. 将所有权设置为符号链接和/home/db/mysqlmysql:mysql

重启后一切正常,并且不会再死机。

我可以使用以下方式启动和停止服务sudo /etc/init.d/mysql start sudo /etc/init.d/mysql stop

我猜是迁移到 systemd 导致了所有这些麻烦。也许使用旧的 init.d 脚本不是最好的方法,但我发现这是在重启后保持 MariaDB 运行的唯一方法,否则它会因为

kernel: [ 2336.792423] audit: type=1400 audit(1470265086.730:518): apparmor="DENIED" operation="sendmsg" info="Failed name lookup - disconnected path" error=-13 profile="/usr/sbin/mysqld" name="run/systemd/notify" pid=11850 comm="mysqld" requested_mask="w" denied_mask="w" fsuid=117 ouid=0 

由于我使用的某些客户端提供了Failed to connect to database: Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2),因此我必须创建一个符号链接sudo ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock。但是重启后链接被删除了……

因此,我不得不编辑/etc/mysql/my.cnf/etc/mysql/debian.cnf文件来设置socket = /tmp/mysql.sock。debian.cnf 说DO NOT TOUCH!,但我冒险一试,因为 my.cnf 说Remember to edit /etc/mysql/debian.cnf when changing the socket location。注意:需要重新启动才能看到更改已应用。仅重新启动服务并不能应用它们。也许应该重新加载某个守护进程,但不知道是哪一个。

答案2

在我的例子中,我在 Ubuntu Xenial 16.04 上安装了 MariaDB 10.2,并使用符号链接指向用户主目录中的数据库。这在 10.0 上工作正常,但现在会返回错误

[错误] InnoDB:文件操作中出现操作系统错误编号 13。

[错误] InnoDB:该错误意味着 mysqld 没有该目录的访问权限。

[错误] InnoDB:os_file_readdir_next_file() 在目录 ./ 中返回 -1,某些 .ibd 文件的崩溃恢复可能失败!

所有文件和目录均归 mysql:mysql 所有。不过,感谢提问者,我在/lib/systemd/system/mariadb.service设置中找到了:

#防止访问 /home、/root 和 /run/user

ProtectHome=true

设置完成后falsesystemctl daemon-reloadMariaDB 将正常启动。

希望这对某人有帮助。

相关内容