现象

在Ubuntu上,使用mysql命令连接server的时候,报错:

$ mysql -u user001 -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

这个出错信息让人十分困惑,因为虽然mysql命令连不上,但是用python的pymysql lib却可以连接的。我又尝试查找mysqld.sock文件,确实没有找到,再次尝试从其他working的机器上去copy 这个文件,发现这个文件是0字节的。进一步查询,终于弄明白了。

分析

mysqld.sock 是 MySQL 的 Unix Socket 文件;它是替代使用TCP/IP方式在本地连接的。就是说在连接本地MySQL server直接使用socket(IPC)方式,避免TCP/IP跑一圈。

所以目前可以确定:MySQL server确实在运行,但是使用socket方式连不上。

使用systemctl status mysql查看服务状态,并未出现Active的状态,而是一个之前没有见过的状态activating, 似乎说这个服务一直在启动中。

继续分析,使用 ps aux|grep mysql, 终于发现问题,居然有两个服务在后台:

$ ps aux |grep mysql
mysql    2249166  0.3  0.7 2441604 516504 ?      Sl   13:31   0:02 /usr/sbin/mysqld --defaults-file=/etc/mysql/my.cnf
mysql    2253071  0.5  0.4 734740 295552 ?       Ssl  13:41   0:00 /usr/sbin/mysqld
root     2253375  0.0  0.0   6608  2560 pts/1    S+   13:42   0:00 grep --color=auto mysql

并且不带参数的那个mysqld的pid一直在变,所以即使使用kill也杀不掉,貌似这个process也一直在被重启中。

解决 上面说,使用kill -9 2253071 并不work,因为这是个在启动中的进程,即使杀掉,也会被再次拉起来。想要彻底停止所有MySQL服务:

systemctl stop mysql
systemctl stop mysqld

# 强制杀死残留进程
sudo pkill -9 mysqld

最终再次启动mysqld,一切恢复正常。目前尚不清楚为什么有个残留的mysql进程在系统中,至少问题解决了。