【问题标题】:Mysql won't start anymore [closed]Mysql将不再启动[关闭]
【发布时间】:2017-11-18 07:37:45
【问题描述】:

我想再次查看我的日志服务器,但是当我访问 url 时突然收到这条消息:

我在 ubuntu xenial 上运行

致命:无法连接到“localhost”上的 MySQL 服务器。请确保您在 'include/config.php' 中指定了有效的 MySQL 数据库名称

当我执行 journalctl -xe 时,我收到以下消息:

-- Unit mysql.service has begun starting up.
Jun 15 19:26:12 arjanlog audit[3665]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/proc/3665/status" pid=3665 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=112 ouid=112

Jun 15 19:26:12 arjanlog audit[3665]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/sys/devices/system/node/" pid=3665 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=112 ouid=0

Jun 15 19:26:12 arjanlog audit[3665]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/proc/3665/status" pid=3665 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=112 ouid=112
Jun 15 19:26:12 arjanlog kernel: audit: type=1400 audit(1497547572.504:69): apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" 
name="/proc/3665/status" pid=3665 comm="mysqld" requested_mask="r" denied_m

Jun 15 19:26:12 arjanlog kernel: audit: type=1400 audit(1497547572.504:70): apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/sys/devices/system/node/" pid=3665 comm="mysqld" requested_mask="r"

Jun 15 19:26:12 arjanlog kernel: audit: type=1400 audit(1497547572.504:71): apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/proc/3665/status" pid=3665 comm="mysqld" requested_mask="r" denied_m

Jun 15 19:26:12 arjanlog systemd[1]: mysql.service: Main process exited, code=exited, status=1/FAILURE

【问题讨论】:

  • 我会说DENIED,这似乎是一个权限问题。
  • 试试这个:sudo apt-get install mysql-server
  • @Edward mysql-server 已经是最新版本(5.7.18-0ubuntu0.16.04.1)

标签: mysql ubuntu


【解决方案1】:

我也遇到了这个问题,通过修复/etc/apparmor.d/usr.sbin.mysqld的apparmor配置文件解决了这个问题。我添加了这些行:

  /proc/*/status r,
  /sys/devices/system/node/ r,
  /sys/devices/system/node/node0/meminfo r,

您的journalctl -xe 输出显示了 MySQL 需要使用权限的文件。也可以看/var/log/syslog

Jun 15 19:26:12 arjanlog audit[3665]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/proc/3665/status" pid=3665 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=112 ouid=112
Jun 15 19:26:12 arjanlog audit[3665]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/sys/devices/system/node/" pid=3665 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=112 ouid=0
Jun 15 19:26:12 arjanlog audit[3665]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/proc/3665/status" pid=3665 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=112 ouid=112

这意味着 /usr/sbin/mysqldDENIED 试图打开 /proc/3665/status/sys/devices/system/node/ 进行阅读 (r)。

请注意,在 apparmor 配置文件中,/sys/devices/system/node/ 中的尾部斜杠是必需的,所以不要忽略它!

【讨论】:

  • 对我来说,这删除了错误消息,但 MySQL 仍然无法启动。我最后查看了 MySQL 错误日志(例如,/var/log/mysql/error.log)并注意到为 MySQL 分配内存的错误(例如,`InnoDB:无法为缓冲池分配内存`)。事实证明,我的 EC2 实例没有交换驱动器。我按照此处的说明创建了一个,MySQL 立即启动:stackoverflow.com/questions/10284532/…
【解决方案2】:

可能没有必要完全停止 apparmor。如果您不想追查核心问题,那么为 mysqld 禁用 apparmor 就足够了:

ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld

【讨论】:

    【解决方案3】:

    对我来说,错误是 mysql 数据库已损坏。我可以看到当我转到日志/var/log/mysql/error.log 时,它显示了一个错误:

    InnoDB: Database was not shutdown normally!
    

    有一些解决方案可供某人使用,例如 table corruption issue

    但这对我不起作用,因为我无法以 WRITE 模式启动服务器来解决问题。

    我设法通过创建目录/var/lib/mysql 的副本解决了这个问题 - 我复制到mysql.old 然后删除了mysql 目录。

    然后我在终端中调用了一个命令:

    sudo mysqld --initialize --initialize-insecure
    

    生成一个新的mysql目录

    然后我通过将mysql 目录的用户和组更改为用户:mysql 和组:mysql 来更改新目录的权限。使用chown 命令:

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

    然后我调用命令:

    sudo mysql -u root
    

    并更改密码:

    SET PASSWORD FOR root@'localhost' = PASSWORD('newpassword');
    

    然后重启mysql服务器:

    sudo service mysql restart
    

    一切正常。


    我在此过程中使用的一些命令是(尽管不确定它们对解决问题有多大贡献):

    sudo apt-get --reinstall install mysql-server-5.7
    

    【讨论】:

    • 我必须先禁用 apparmor 的 mysql 配置文件,否则它不会让我重新初始化 mysql。
    【解决方案4】:

    我在另一个 SO 线程评论中读到 apparmor="DENIED" 消息可能不是 MySQL(或者在我的情况下是 MariaDB)没有启动的原因,因为它只是一个警告。

    在我的情况下,更新和升级 apt 安装的软件包并重新启动系统解决了这个问题。

    sudo apt-get dist-upgrade
    sudo apt-get update
    sudo apt-get upgrade
    sudo reboot
    

    然后您需要等待几分钟,系统重新启动并重新登录并使用servicesystemctl 和我想可能是/etc/system.d 重新启动服务。

    然后,MariaDB 就开心地大笑了起来。

    关于各种apt upgrade 命令here 的帖子很好,我认为update 所做的就是更新源列表。

    /var/log/mysql 中没有日志文件时,我发现这个命令也很有用:

    tail -f /var/log/syslog | grep mysql
    

    【讨论】:

      【解决方案5】:

      当我试图将 mysql 文件从 /var/lib/mysql 移动到其他地方时,我遇到了这个错误。

      将配置添加到 /etc/apparmor.d/usr.sbin.mysqld 对我不起作用

      然后我得到了这个bug for ubuntu

      它说:

      sudo nano /etc/apparmor.d/usr.sbin.mysqld
      line 25 after:
      # Allow config access
        /etc/mysql/** r,
      -add line:
        /etc/mysql/* r,
      

      它对我有用:

      /etc/mysql/* r, 添加到/etc/apparmor.d/usr.sbin.mysqld

      运行systemctl restart apparmor.service

      service mysql start

      【讨论】:

        【解决方案6】:

        按照https://stackoverflow.com/a/45986591 中的说明进行操作后,我仍然无法让 MySql 服务器运行。我通过 tail -30 /var/log/mysql/error.log 检查了它的日志。这条线引起了我的注意2019-05-21T04:46:03.462807Z 0 [ERROR] InnoDB: Cannot allocate memory for the buffer pool。通过阅读上一行代码,我发现它正在尝试分配 128MB 的内存。然后我检查了我的内存状态,它只有 111 Mb 可用。我停止了几个程序(节点服务器)并重新启动了 MySql,它开始工作。然后我评论了我输入的所有 AppArmor 条目并重新启动了 AppArmor 和 MySql。 MySql 启动时没有任何错误。所以我可以得出结论,MySql 没有获得足够的内存来启动。

        【讨论】:

          【解决方案7】:

          解决方法:sudo service apparmor teardown

          【讨论】:

            猜你喜欢
            • 2012-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多