mysql,mysqldump,php 连线 mysql 服务常会提示下面错误:
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
产生此问题的原因一般有两个:
1 、 mysql 服务未正常执行:
由于 mysql 的 socket 档案是由 mysqld 服务启动时建立的,如果 mysqld 服务未正常启动,socket 档案自然也不会被建立,当然会找不到 socket 档案了。对于判断 mysql 服务是否启动,我们可以使用下面命令:
# 1 、 埠是否开启
[root@aiezu.com ~]# lsof -i:3306
COMMAND  PID  USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
mysqld  12207 mysql  14u  IPv4  52350      0t0  TCP *:mysql (LISTEN)
# 2 、 mysqld 服务是否正在执行
[root@aiezu.com ~]# service mysqld status
mysqld (pid  4717) is running…
2 、 socket 档案路径在配置档案中设定不完整:
这一般是由于我们修改了 mysql 配置 “/etc/my.cnf” 引起的。比如我们修改了配置档案中 “[mysql]” 选项下的 “socket” 引数,而未指定 “[client]” 、 “[mysql]” 选项的 “socket” 引数,导致 mysql 使用预设的 socket 档案位置去寻找 socket 档案,从而导致未找到 socket 档案而引发此错误。
下面是解决方法
1 、 mysql 服务未正常执行:
如果是服务未启动,我们执行 “service mysqld start” 启动服务即可。如果服务启动不了,就去检视 mysql 服务日志,寻找原因并解决再启动
[root@aiezu.com ~]# service mysqld start
Starting mysqld:                                          [  OK  ]
[root@aiezu.com ~]# lsof -i:3306
COMMAND  PID  USER  FD  TYPE    DEVICE SIZE/OFF NODE NAME
mysqld  14109 mysql  10u  IPv4 247183583      0t0  TCP *:mysql (LISTEN)
[root@aiezu.com ~]# service mysqld status
mysqld (pid  14109) is running…
2 、完善 mysql 配置档案:
如果确认 mysql 服务正常执行,还提示文章标题的此错误,那就是 “/etc/my.cnf” 配置档案的问题了。解决办法是修改 “/etc/my.cnf” 配置档案,在配置档案中新增 “[client]” 选项和 “[mysql]” 选项,并使用这两个选项下的 “socket” 引数值,与 “[mysqld]” 选项下的 “socket” 引数值,指向的 socket 档案路径完全一致。如下:
[mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
…省略 n 行(爱 E 族)…
[client]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock
[mysql]
default-character-set=utf8
socket=/storage/db/mysql/mysql.sock
其中 socket 等于的路径就是 socket 档案的位置,我们只要修改 my.cnf 档案, 告诉 mysql,mysqldump,mysqladmin 等命令,mysql 服务的 socket 档案位置在哪里,然后重启 mysqld 服务即可。
3 、 php 连线 mysql 服务提示”Can’t connect to local MySQL server through socket…” 的解决方法
有时候 mysql 服务正常执行, 使用者名称密码也完全正确,使用 php 的 mysql_connect 函式却连线不了 mysql,呼叫 php 的 mysql_error() 函式提示 “Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’”,这是我们需要修改/etc/php.ini 档案。
在/etc/php.ini 档案中”[MySQL]” 项下找到”mysql.default_socket”,并设定其值指向正确的 mysql 服务 socket 档案即可,如:
[MySQL]
…省略 n 行…
mysql.default_socket = “/storage/db/mysql/mysql.sock”
4 、 python 连线 mysql 提示”Can’t connect to local MySQL server through socket…” 的解决方法:
在连线 mysql 资料库函式中指定 socket 档案,如下:
#!/usr/bin/python
from MySQLdb import connect
conn = connect(db=”pzy”, user=”root”, host=”localhost”, unix_socket=”/storage/db/mysql/mysql.sock”)
cur = conn.cursor()
count=cur.execute(“show databases”)
print ‘there has %s dbs’ % count
conn.commit()
conn.close()
5. php pdo 连线 mysql 提示”Can’t connect to local MySQL server through socket…” 的解决方法:
同样在连线字串新增 mysql socket 档案的位置即可,如下:
query(“SELECT * FROM qrtest”);
while($row = $rs->fetch()){
print_r($row);
}
?>
要补充的地方是说这个 mysql.sock 档案的位置,我的档案是在/tmp/mysql.sock  但是开启里面是空的,所以当时有一些疑惑  经过实验 证明确实就是这个/tmp/mysql.sock  我的问题主要是 php 连线不上,mysql 客户端是可以的,然后改了 php.ini  重启 php-fpm 就可以了。