共计 2756 个字符,预计需要花费 7 分钟才能阅读完成。
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 文件的位置即可,如下:
<?php
$dsn = “mysql:host=localhost;dbname=pzy;unix_socket=/storage/db/mysql/mysql.sock”;
$db = new PDO($dsn, ‘root’, ”);
$rs = $db->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 就可以了。