一个诡异的MySQL连接问题
现象
在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进程在系统中,至少问题解决了。