Article ID: 119334, created on Aug 14, 2015, last review on Aug 14, 2015

  • Applies to:
  • Plesk for Linux/Unix

问题

该文章适用于以下当中的任何一个问题:

  • MySQL 会随着 mysqld 服务的重启而正常启动/停止,但是当重启动服务器时 MySQL 不会启动。
  • 升级 MySQL 后,二进制 mysqld 将无法启动。
  • 迁移 MySQL 数据目录或更改默认的端口后,MySQL 不会启动。

以上所有情况都有一个相同的问题。您无法启动 'mysqld' 服务且出现错误:

[root@server ~]# /etc/init.d/mysqld start
Another MySQL daemon already running with the same unix socket.
Starting mysqld:                                           [FAILED]

原因

不正确的 MySQL 服务停止后没有移除套接字。

解决方案

当套接字文件被移除后都会出现以下的情况。请检查下面的使用案例并应用相应的方案。

1. '/tmp' 目录的权限不正确

在 CentOS 6.5 上默认的权限是:

    ls -ld /tmp
    drwxrwxrwt 3 root root 16384 Dec 23 17:32 /tmp

检查 '/var/log/mysqld.log' 查看指示在 CentOS 6.5 中的 '/tmp' 有权限问题的信息,这将会影响 'mysqld' 的启动。此 '/tmp' 问题很有可能是手动的维护操作引起的。

131207 21:15:47 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
/usr/libexec/mysqld: Can't create/write to file '/tmp/ib0h0Wt3' (Errcode: 13)
131207 21:15:47  InnoDB: Error: unable to create temporary file; errno: 13
131207 21:15:47 [ERROR] Plugin 'InnoDB' init function returned error.
131207 21:15:47 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
131207 21:15:47 [Note] Event Scheduler: Loaded 0 events
131207 21:15:47 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.1.71'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Source distribution

'mysqld' 正在启动时,会建立 /var/lib/mysql/mysql.sock,然后会因之前在写入 /tmp 时出现的错误以及 /var/lib/mysql/mysql.sock 未被清除的原因而崩溃。

解决了在 /tmp 上的权限问题后,在正常运行 MySQL 的情况下重启 CentOS 结果。

2. MySQL 不会正常关闭

如果 MySQL 服务在重启操作系统期间不会正常关闭,旧的 /var/lib/mysql/mysql.sock 被留下了。这会阻止 'mysqld' 启动。有人可以通过重启主机 CentOS 6.5 系统在 CentOS 6.5 KVM 虚拟系统上重现该错误。CentOS 应该是会正常关闭虚拟机系统,但是好像没法做到'mysqld'

已确定的 Red Hat Linux 6.5 bug - https://bugzilla.redhat.com/show_bug.cgi?id=1037650

在 MySQL bug tracker 上的问题讨论 - http://bugs.mysql.com/bug.php?id=71086

重现该问题的简单步骤:

service mysqld start
killall -9 mysqld_safe mysqld
service mysqld start

注意!没有必要手动从 bug 链接应用补丁,因为已提供了修复程序包。只需更新 mysql-server 程序包:

yum -y update mysql-server

3. SELinux 策略

'/var/log/mysqld.log' 日志中,您会找到如下的错误:

mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
...
[Warning] Can't create test file /var/lib/mysql/boxy.lower-test
[Warning] Can't create test file /var/lib/mysql/boxy.lower-test
...
[ERROR] /usr/sbin/mysqld: Can't create/write to file 
    '/var/lib/mysql/boxy.pid' (Errcode: 13 - Permission denied)
[ERROR] Can't start server: can't create PID file: 
    Permission denied
mysqld_safe mysqld from pid file /var/lib/mysql/boxy.pid ended

如果您确定目录 '/var/lib/mysql' 上的权限是正确的,请查看 '/var/log/audit/audit.log'。可能包含指向 Selinux 问题的类似信息:

    ...
    type=AVC msg=audit(1363866652.030:24): avc:  denied  { write } for  pid=2119 
        comm="mysqld" name="/var/lib/myaql" dev=dm-0 ino=394 
        scontext=unconfined_u:system_r:mysqld_t:s0 
        tcontext=unconfined_u:object_r:default_t:s0 tclass=dir
    ...

若要应用新策略,请允许 MySQL 使用 '/var/lib/myaql' 目录:

semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"
restorecon -Rv /var/lib/myaql
    restorecon reset /var/lib/myaql context 
       unconfined_u:object_r:default_t:s0->unconfined_u:object_r:mysqld_db_t:s0
    restorecon reset /var/lib/myaql/mysql.sock context 
       system_u:object_r:mysqld_var_run_t:s0->system_u:object_r:mysqld_db_t:s0 

若要启动 MySQL 服务,您可以移除 '/var/lib/mysql/mysql.sock' 并再次启动 MySQL 服务:

  1. 移除套接字文件:

    [root@server ~]# rm /var/lib/mysql/mysql.sock
    rm: remove socket `/var/lib/mysql/mysql.sock'? yes
    
  2. 启动 MySQL 服务:

    [root@server~]# service mysqld start
    Starting mysqld:                                           [  OK  ]
    

a914db3fdc7a53ddcfd1b2db8f5a1b9c 56797cefb1efc9130f7c48a7d1db0f0c 29d1e90fd304f01e6420fbe60f66f838

Email subscription for changes to this article