阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Can’t connect to local MySQL server through socket

106次阅读
没有评论

共计 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 就可以了。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计2756字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中