为什么 mariadb 不断死亡?我该如何阻止?

T.J*_*.L. 27 mysql timeout mariadb 15.10

我在 Ubuntu 15.10 上运行 MariaDB 10.0.23-0 作为 LAMP 服务器。运行sudo /etc/init.d/mysql start结果:

Job for mariadb.service failed because a timeout was exceeded. See "systemctl status mariadb.service" and "journalctl -xe" for details.

的输出systemctl status mariadb.service是:

? mariadb.service - MariaDB 数据库服务器
   已加载:已加载(/lib/systemd/system/mariadb.service;已启用;供应商预设:已启用)
  插入:/etc/systemd/system/mariadb.service.d
           ??migrated-from-my.cnf-settings.conf
   活动:自美国东部时间周六 2016-03-26 22:52:42 起失败(结果:超时);26 秒前
  进程:8707 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER (code=exited, status=0/SUCCESS)
  进程:8706 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
 主PID:8707(代码=退出,状态=0/成功)

3 月 26 日 22:52:39 boggan systemd[1]:mariadb.service:启动操作超时。终止。
Mar 26 22:52:39 boggan mysqld[8707]: 2016-03-26 22:52:39 140105856617216 [注意] /usr/sbin/mysqld: 正常关机
Mar 26 22:52:39 boggan mysqld[8707]: 2016-03-26 22:52:39 140105856617216 [注意] 事件调度程序:清除队列。0 事件
Mar 26 22:52:39 boggan mysqld[8707]: 2016-03-26 22:52:39 140104920164096 [注意] InnoDB:FTS 优化线程退出。
Mar 26 22:52:39 boggan mysqld[8707]: 2016-03-26 22:52:39 140105856617216 [注意] InnoDB:正在启动关闭...
Mar 26 22:52:42 boggan mysqld[8707]: 2016-03-26 22:52:42 140105856617216 [注] InnoDB:关闭完成;日志序列号 3336953
Mar 26 22:52:42 boggan mysqld[8707]: 2016-03-26 22:52:42 140105856617216 [注意] /usr/sbin/mysqld:关闭完成
3 月 26 日 22:52:42 boggan systemd[1]:无法启动 MariaDB 数据库服务器。
3 月 26 日 22:52:42 boggan systemd[1]:mariadb.service:单元进入失败状态。
3 月 26 日 22:52:42 boggan systemd[1]:mariadb.service:因结果“超时”而失败

第一systemd行有点“嗯”。我知道它超时了。第二个systemd,在mysqld台词之后有点神秘,因为它确实开始了。依赖于数据库的应用程序(特别是OwnCloud)正常工作......对于MariaDB启动的一分钟和变化。

另一个问题建议使用time /etc/init.d/mysql start来确定需要多长时间。我反复运行它以确认时间 - 每次都是 90 秒左右的几秒钟。

其他研究让我检查文件权限,这很好......此外,它确实会暂时启动。我已经尽我所能(在 Linux 方面确实有限),但我没有取得任何进展。

所以,问题是……我如何让 MariaDB 服务保持正常运行?

作为一个额外的皱纹,写完这个问题后,我让机器继续运行。一周后我又回到了它(我没有碰它)。使用完全相同的命令 ,sudo /etc/init.d/mysql start成功了。mysql 守护进程启动并运行;它带着一份[ ok ]报告回来了。为了实验,我重新启动了,然后我又回到了开始的地方。

如果重要,输出journalctl -xe是:

Apr 02 23:51:44 boggan systemd[1]: Stopped 提前读取所需文件。
-- 主题:单元 ureadahead.service 已完成关闭
-- 定义者:systemd
-- 支持:http://lists.freedesktop.org/mailman/listinfo/systemd-devel
—— 
-- 单元 ureadahead.service 已完成关闭。
Apr 02 23:51:55 boggan mysqld[2645]: 2016-04-02 23:51:55 140386161068800 [注] InnoDB:在线 DDL:开始
Apr 02 23:51:55 boggan mysqld[2645]: 2016-04-02 23:51:55 140386161068800 [注意] InnoDB:在线 DDL:开始读取表的聚集索引并创建临时文件
Apr 02 23:51:55 boggan mysqld[2645]: 2016-04-02 23:51:55 140386161068800 [注意] InnoDB: Online DDL: 读表的聚集索引结束并创建临时文件
Apr 02 23:51:55 boggan mysqld[2645]: 2016-04-02 23:51:55 140386161068800 [注] InnoDB:在线 DDL:已完成
Apr 02 23:51:55 boggan mysqld[2645]: 2016-04-02 23:51:55 140386161068800 [注] InnoDB:在线 DDL:已完成
4 月 2 日 23:52:06 boggan dbus[713]:[系统] 无法激活服务“org.bluez”:超时
4 月 2 日 23:52:37 boggan systemd[1]:mariadb.service:启动操作超时。终止。
Apr 02 23:52:37 boggan mysqld[2645]: 2016-04-02 23:52:37 140386097400576 [注意] /usr/sbin/mysqld: 正常关机
4 月 2 日 23:52:37 boggan 内核:审计:type=1400 审计(1459655557.935:31):apparmor="DENIED" operation="sendmsg" profile="/usr/sbin/mysqld" name="/run/systemd/通知"pid=2645 comm="mysqld"requested_mask="w" denied_mask="w" fsuid=122 ouid=0
4 月 2 日 23:52:37 boggan 审计 [2645]:AVC apparmor="DENIED" operation="sendmsg" profile="/usr/sbin/mysqld" name="/run/systemd/notify" pid=2645 comm=" mysqld"requested_mask="w" denied_mask="w" fsuid=122 ouid=0
Apr 02 23:52:37 boggan mysqld[2645]: 2016-04-02 23:52:37 140386097400576 [注意] 事件调度程序:清除队列。0 事件
Apr 02 23:52:37 boggan mysqld[2645]: 2016-04-02 23:52:37 140385225500416 [注意] InnoDB:FTS 优化线程退出。
Apr 02 23:52:37 boggan mysqld[2645]: 2016-04-02 23:52:37 140386097400576 [注意] InnoDB:正在启动关闭...
Apr 02 23:52:39 boggan mysqld[2645]: 2016-04-02 23:52:39 140386097400576 [注] InnoDB:关闭完成;日志序列号 3360838
Apr 02 23:52:39 boggan mysqld[2645]: 2016-04-02 23:52:39 140386097400576 [注意] /usr/sbin/mysqld:关闭完成
4 月 2 日 23:52:39 boggan 内核:审计:type=1400 审计(1459655559.419:32):apparmor="DENIED" operation="sendmsg" profile="/usr/sbin/mysqld" name="/run/systemd/通知"pid=2877 comm="mysqld"requested_mask="w" denied_mask="w" fsuid=122 ouid=0
4 月 2 日 23:52:39 boggan 审计 [2877]:AVC apparmor="DENIED" operation="sendmsg" profile="/usr/sbin/mysqld" name="/run/systemd/notify" pid=2877 comm=" mysqld"requested_mask="w" denied_mask="w" fsuid=122 ouid=0
4 月 2 日 23:52:39 boggan 审计 [2645]:AVC apparmor="DENIED" operation="sendmsg" profile="/usr/sbin/mysqld" name="/run/systemd/notify" pid=2645 comm=" mysqld"requested_mask="w" denied_mask="w" fsuid=122 ouid=0
4 月 2 日 23:52:39 boggan 内核:审计:type=1400 审计(1459655559.419:33):apparmor="DENIED" operation="sendmsg" profile="/usr/sbin/mysqld" name="/run/systemd/通知"pid=2645 comm="mysqld"requested_mask="w" denied_mask="w" fsuid=122 ouid=0
4 月 2 日 23:52:39 boggan systemd[1]:无法启动 MariaDB 数据库服务器。
-- 主题:mariadb.service 单元失败
-- 定义者:systemd
-- 支持:http://lists.freedesktop.org/mailman/listinfo/systemd-devel
—— 
-- 单元 mariadb.service 失败。
—— 
-- 结果失败。
4 月 2 日 23:52:39 boggan systemd[1]:mariadb.service:单元进入失败状态。
4 月 2 日 23:52:39 boggan systemd[1]:mariadb.service:因结果“超时”而失败。

Chr*_*Aga 31

从 mysql 升级到 mariadb 后,我遇到了完全相同的问题。奇怪的是 service mariadb start 在超时时失败(在系统启动或手动时),而 service mysql start 成功。

TJL给出的解释是正确的,但更正对我不起作用。

$ sudo aa-complain /usr/sbin/mysqld
Setting /usr/sbin/mysqld to complain mode.

ERROR: /etc/apparmor.d/usr.sbin.mysqld contains no profile
Run Code Online (Sandbox Code Playgroud)

所以我禁用了配置文件(使用 aa-disable 似乎相当于pltocrat的解决方案)

$ sudo aa-disable /usr/sbin/mysqld
Disabling /usr/sbin/mysqld.
Run Code Online (Sandbox Code Playgroud)

我也禁用了 mysqld-akonadi 和 mysqld-digikam。

apparmor 重新加载是不够的,所以我不得不重新启动并且 mariadb 启动得非常好。


T.J*_*.L. 26

apparmor 是罪魁祸首。尽管内容/etc/apparmor.d/usr.sbin.mysqld只是评论并声称它在那里以便 apparmor 不会在 MariaDB 上窒息,但这正是正在发生的事情。

Oracle 博客上的AppArmor 和 MySQL提供了我需要弄清楚发生了什么。

sudo aa-status向您展示 apparmor 正在做什么;什么实际上有强制执行的政策,而不是刚刚设置的抱怨。

sudo apt-get install apparmor-utils 添加了一些使 apparmor 配置文件更易于处理的命令,例如...

sudo aa-complain /usr/sbin/mysqld将配置文件从“强制”变为抱怨。(aa-enforce把它转回来。)

完成后,sudo service apparmor reload重新启动 apparmor,瞧...sudo /etc/init.d/mysql start工作,并且服务器保持运行状态。


小智 17

我不得不在 apparmor 中完全禁用 mysql。一个aa-complain 不会为我做任何事情。所以 ...

ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
Run Code Online (Sandbox Code Playgroud)

然后重启


小智 11

一个简单的解决方案是删除任何未知的 AppArmor 配置文件:

aa-remove-unknown
Removing '/snap/core/6350/usr/lib/snapd/snap-confine'
Removing '/usr/sbin/mysqld'
Run Code Online (Sandbox Code Playgroud)

有用!

  • 这实际上是我需要做的事情才能运行,所以谢谢。上面接受的答案会给我“错误:/etc/apparmor.d/usr.sbin.mysqld 不包含配置文件”,因为这完全正确,因为该文件仅包含注释。也许在较新版本的 AppArmor 中,他们将这些文件设置为失败,而它在 2016 年工作。 (2认同)
  • 这是正确的答案(至少在 2019 年是这样)。发生的情况是在卸载 MySql 后,`/usr/sbin/mysqld` 的 AppArmor 配置文件仍然加载在内核中。运行`aa-remove-unknown`(或重启)可以解决这个问题。 (2认同)