PHP连接MySQL报错:SQLSTATE[HY000] [2002] Can’t connect to local MySQL server through socket ‘MySQL’ (2)

一.问题发现

今天在服务器上同时安装了mysql和mariadb,经过一番操作之后,发现原来的php程序不能连接mysql了,每次连接就会提示

1
SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket 'MySQL' (2)

在网上找了很多解决方法(csdn越来越垃圾了,都是千篇一律的复制粘贴,没有真正解决问题的),么有找到方法,在google找了几个解决方法,经过测试可以使用,并明白了原理。

二.问题解析

如果提示这个错误,如果将连接参数中的localhost换成 127.0.0.1就能正常使用,这是为什么呢?
这是因为使用localhost是通过套接字(socket)通讯,而127.0.0.1是通过tcp/ip协议通讯,而mysql的报错就是没有找到这个套接字文件(mysql.sock),
一般出现这种情况是因为(个人总结,可能还有其他原因,欢迎补充)

  • 有些安装mysql的方法没有将此文件放在了其他位置,php连接mysql时没有找到这个文件
  • php没有访问这个文件的权限
  • 这个文件被删除了

三.问题解决

找到问题了,现在就要解决问题
首先既然php找不到这个文件,那我们先全局找一下这个文件在哪儿

1
sudo find / -name mysql.sock

如果没找到这个文件,尝试搜索一下 mysqld.sock

1
sudo find / -name mysqld.sock

找到以上两个文件的任一文件,首先记一下文件的绝对路径, 我这边找到的是 /usr/local/mysql/data/mysqld.sock

如果没有找到,需要自己从其他地方复制一份,这个需要自己去搜索解决方法

我找到了两种解决方法

1.修改php.ini

打开php的配置文件, 一般是/etc/php.ini
然后找到[MYSQL]段落,下面有一个mysql.default_socket,将上面记录的socket文件的绝对路径填写到 等号后面。

1
mysql.default_socket= /usr/local/mysql/data/mysqld.sock

然后再找到[Pdo_mysql]段落,下面有一个pdo_mysql.default_socket,将上面记录的socket文件的绝对路径填写到 等号后面。

1
pdo_mysql.default_socket= /usr/local/mysql/data/mysqld.sock

修改好之后,保存退出。重启apache或者nginx,必须要重启,不然不生效。
再次测试连接mysql,看是否已经正常。

2.设置软连接(推荐)

执行命令即可

1
sudo ln -s /usr/local/mysql/data/mysqld.sock /var/lib/mysql/mysql.sock

前一个地址是mysql.sock或mysqld.sock的绝对路径,后一个路径为php没有找到socket文件的路径,我这边是/var/lib/mysql/mysql.sock,执行过命令之后,再次重新连接一下mysql,看是否已经正常。