首先说明一下mysql.sock文件的作用:
连接mysql有两种方式,第一种是TCP/IP,第二种就是直接使用unix domain socket,它比TCP/IP块。
mysql.sock是在mysql-server和client在同一服务器上时,发起本地连接时可用,而无需定义-h参数指定具体的IP。mysql.sock是随每次mysql server启动时生成,通常配置参数是将mysql.sock生成在/tmp/目录下。即在/etc/my.cnf文件中指定socket=/tmp/mysql.sock
因此如果出现的是ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘。
(1) 首先确认配置参数是否正确,尝试重启mysql。
(2) 如果不成功,可以用
find / -name mysql.sock
定位文件在哪里。是不是socket被误放在其他地方,参考链接
(3) 会不会是权限设置问题,
chown -R mysql:mysql /var/lib/mysql
(4) 或者...其他情况
但是注意看,这里我出现的问题是 ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘ (2)
排查:
(1)find / -name mysql.sock 看到mysql.sock在/tmp/路径下,/etc/my.cnf 的socket路径也是/tmp/mysql.sock;
(2) 用
ps -ef |grep mysql
看,似乎也没问题。
root 806 1 0 3月05 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/var --pid-file=/usr/local/mysql/var/linpeisong-PC.pid
mysql 1233 806 0 3月05 ? 00:00:27 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/var/linpeisong-PC.err --pid-file=/usr/local/mysql/var/linpeisong-PC.pid --socket=/tmp/mysql.sock --port=3306
但是如果我们手动指定--socket参数,即
mysql --socket=/tmp/mysql.sock -uroot -ppassword
是可以正常连接的。
(3) 最后参考这篇文章找到根源:参考链接
因为mysql会按顺序读取配置文件/etc/my.conf,/etc/mysql/my.conf,/usr/etc/my.con,~/.my.conf,后面的会将前面的覆盖。而此时在我的/etc/mysql/my.conf文件中,配置的socket参数就是
socket = /var/run/mysqld/mysqld.sock
有一个做法可以创建链接文件解决,如
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
但是用这种方法后面可能会遇到php又找不到mysql.sock的问题。
因此直接将/etc/mysql/my.cnf重新命名
mv /etc/mysql/my.cnf /etc/mysql/my.cnf_backup
就可以利用默认/etc/my.cnf正常连接。
Can't connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘ (2)解决思路