如果在 /etc/mysql/my.cnf 中更改了 .sock 文件,则无法启动 MySQL 服务器

use*_*844 9 mysql sockets

我已经在 Ubuntu 12.04 上安装了 MySQL 服务器 5.5。我正在尝试在不同的 sock 文件上启动 MySQL 服务器。默认情况下,MySQL 在 /var/run/mysqld/mysqld.sock 上运行。

我试图在 /var/run/mysqld/mysqld1.sock 上运行相同的服务器。

为此,我进行了以下更改:

  1. 对 /etc/mysql/my.cnf 的更改
[客户]
    端口 = 3306
    socket = /var/run/mysqld/mysqld1.sock

[mysqld_safe]
    socket = /var/run/mysqld/mysqld1.sock
    不错 = 0

[mysqld]
    用户 = mysql
    pid-file = /var/run/mysqld/mysqld.pid
    **socket = /var/run/mysqld/mysqld1.sock**
    端口 = 3306
    basedir = /usr
    数据目录 = /var/lib/mysql
    tmpdir = /tmp
    lc-messages-dir = /usr/share/mysql
  1. 我还将以下行添加到 /etc/apparmor.d/usr/sbin.mysqld

    /var/run/mysqld/mysqld1.sock w,

    /var/run/mysqld/mysqld[1-9].sock w,

  2. 我还将目录 /var/run/mysqld 的所有权更改为 mysql 用户。

    ls -lA /var/run/ | grep mysqld

    drwxrwxrwx 2 mysql mysql 40 Dec 31 17:24 mysqld

但是,当我尝试启动 MySQL 服务器时,出现以下错误(作为 root 用户)

    $ mysqld --user=mysql --verbose
    121231 18:40:56 [注意] 插件“联邦”被禁用。
    121231 18:40:56 InnoDB:InnoDB 内存堆被禁用
    121231 18:40:56 InnoDB:互斥锁和 rw_locks 使用 GCC 原子内置函数
    121231 18:40:56 InnoDB:压缩表使用 zlib 1.2.3.4
    121231 18:40:56 InnoDB:初始化缓冲池,大小 = 128.0M
    121231 18:40:56 InnoDB:缓冲池初始化完成
    121231 18:40:56 InnoDB:支持的最高文件格式是梭子鱼。
    121231 18:40:57 InnoDB:等待后台线程启动
    121231 18:40:58 InnoDB:1.1.8 开始;日志序列号 1595685
    121231 18:40:58 [注意] 服务器主机名(绑定地址):'127.0.0.1';端口:3306
    121231 18:40:58 [注意] - “127.0.0.1”解析为“127.0.0.1”;
    121231 18:40:58 [注意] 在 IP 上创建的服务器套接字:'127.0.0.1'。
   **`121231 18:40:58 [错误] 无法启动服务器:绑定在 unix 套接字上:权限被拒绝`**

    121231 18:40:58 [错误] 您是否已经在套接字上运行了另一个 mysqld 服务器: 
    /var/run/mysqld/mysqld1.sock ?
    121231 18:40:58 [错误] 中止**
    121231 18:40:58 InnoDB:开始关闭...
    121231 18:40:58 InnoDB:关闭完成;日志序列号 1595685
    121231 18:40:58 [注意] mysqld:关闭完成

如果我使用默认套接字文件启动服务器,我就可以启动服务器。我用谷歌搜索过这个问题,但只找到了表明它是权限问题的解决方案。但是权限似乎很好。有些人认为 AppArmor 可能是一个原因,但我也检查过 - 片段粘贴在上面。

有人可以提供一些线索吗?

[编辑]

我在/var/log/syslog.

Jan 2 12:09:34 praveshp-lt mysqld: 130102 12:09:34 [注意] 插件“联邦”被禁用。
Jan 2 12:09:34 praveshp-lt mysqld: 130102 12:09:34 InnoDB:InnoDB 内存堆被禁用
Jan 2 12:09:34 praveshp-lt mysqld: 130102 12:09:34 InnoDB:互斥锁和 rw_locks 使用 GCC 原子内置函数
Jan 2 12:09:34 praveshp-lt mysqld: 130102 12:09:34 InnoDB:压缩表使用 zlib 1.2.3.4
Jan 2 12:09:34 praveshp-lt mysqld:130102 12:09:34 InnoDB:初始化缓冲池,大小 = 128.0M
Jan 2 12:09:34 praveshp-lt mysqld: 130102 12:09:34 InnoDB:缓冲池初始化完成
Jan 2 12:09:34 praveshp-lt mysqld: 130102 12:09:34 InnoDB:支持的最高文件格式是梭子鱼。
Jan 2 12:09:35 praveshp-lt mysqld:130102 12:09:35 InnoDB:等待后台线程启动
Jan 2 12:09:36 praveshp-lt mysqld:130102 12:09:36 InnoDB:1.1.8 启动;日志序列号 1595685
Jan 2 12:09:36 praveshp-lt mysqld: 130102 12:09:36 [注意] 服务器主机名(绑定地址):'127.0.0.1'; 端口:3307
Jan 2 12:09:36 praveshp-lt mysqld: 130102 12:09:36 [注意] - '127.0.0.1' 解析为 '127.0.0.1';
Jan 2 12:09:36 praveshp-lt mysqld: 130102 12:09:36 [注意] 在 IP 上创建的服务器套接字:'127.0.0.1'。
Jan 2 12:09:36 praveshp-lt mysqld: 130102 12:09:36 [错误] 无法启动服务器:绑定在 unix 套接字上:权限被拒绝
Jan 2 12:09:36 praveshp-lt mysqld: 130102 12:09:36 [错误] 您是否已经在套接字上运行了另一个 mysqld 服务器:/var/run/mysqld/mysqld1.sock?
Jan 2 12:09:36 praveshp-lt mysqld: 130102 12:09:36 [错误] 中止
1 月 2 日 12:09:36 praveshp-lt mysqld: 
Jan 2 12:09:36 praveshp-lt mysqld: 130102 12:09:36 InnoDB:开始关闭...
Jan 2 12:09:36 praveshp-lt 内核:[7060.098580] type=1400 audit(1357108776.036:33):apparmor="DENIED" operation="mknod" parent=6702 profile="/usr/sbin/mysqld" name= "/run/mysqld/mysqld1.sock" pid=7039 comm="mysqld" requests_mask="c" denied_mask="c" fsuid=116 ouid=116
Jan 2 12:09:36 praveshp-lt mysqld:130102 12:09:36 InnoDB:关闭完成;日志序列号 1595685
Jan 2 12:09:36 praveshp-lt mysqld: 130102 12:09:36 [注意] /usr/sbin/mysqld:关闭完成

它说权限被拒绝,但是我似乎设置了正确的权限。

use*_*844 6

通过查看日志中下一行中的这一行,似乎 Apparmor 拒绝访问。

Jan  2 12:09:36 praveshp-lt kernel: [ 7060.098580] type=1400 audit(1357108776.036:33):
     apparmor="DENIED" operation="mknod" parent=6702 profile="/usr/sbin/mysqld" 
     name="/run/mysqld/mysqld1.sock" pid=7039 comm="mysqld" requested_mask="c"
     denied_mask="c" fsuid=116 ouid=116
Run Code Online (Sandbox Code Playgroud)

为此,请添加/etc/apparmor.d/local/usr.sbin.mysqld包含以下条目的文件,然后重新启动 MySQL。

/var/run/mysqld/mysqld1.sock w,
Run Code Online (Sandbox Code Playgroud)

感谢Rinzwind指出这一点。