Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory解决方法
今天用pdo连接mysql遇到一个奇怪的问题,host设为127.0.0.1可以连接成功,设为localhost就会报如下的错误:
- PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory' in /usr/share/nginx/html/test.php:2
- Stack trace:
- #0 /usr/share/nginx/html/test.php(2): PDO->__construct('mysql:host=loca...', 'root', 'aaaaaa')
- #1 {main}
- thrown in /usr/share/nginx/html/test.php on line 2
第一反应是mysql:user表中(user=user1,host=localhost)的这条记录没有密码,但是查了以后发现并不是,而且密码和(user=user1,host=%)的密码一致,排除密码的问题,现在还剩下一个地方就是host。那么用localhost连接MySQL和127.0.0.1有什么区别呢?在我们印象中这两个都可以访问到本地的服务,但是本质上有什么区别的?
host=127.0.0.1,使用 TCP连接,mysql server会认为这个连接来自127.0.0.1这个IP或者localhost.localdomin这个域名。
host=localhost,不使用TCP连接,它使用Unix socket连接mysql服务
以上是这两种host连接区别的简单总结(更详细的我会再单独整理一篇出来)。知道了这个区别,那么问题来了,当php用localhost去连接mysql的时候,它该用哪个socket呢?大家都知道mysql服务启动后它的进程里有一个--socket=/var/lib/mysql/mysql.sock的参数(大家的地址和我的可能会不相同,这个可以在mysq.cnf中进行设置),其中这个mysql.sock就是要用到的socket,我们只要把这个完整地址告诉php就可以,告诉的方式就是修改php.ini
- pdo_mysql.default_socket=
设置好以后重启php-fpm就大功告成了。
解决方法总结:
1.查看mysql库下面的user表中,user=用户名,host=localhost的这条记录密码是否和user=用户名,host=127.0.0.1这条记录的密码是否相同,不同的改个密码再试试
2.看看php.ini中pdo_mysql.default_socket这项是否有配置或者配置是否正确。
另外一处的文章:
今天连接mysql数据库的时候遇到一个问题:Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
参考网上相关的方法,包括:(http://blog.csdn.net/lmss82/archive/2009/08/05/4414178.aspx)
方案1.
 1.#ps -A|grep mysql 
   显示类似:
  1829 ?        00:00:00 mysqld_safe
   1876 ?        00:00:31 mysqld
  2.#kill -9 1829
  3.#kill -9 1876
  4.#/etc/init.d/mysql restart
  5.#mysql -u root -p
   他的麻烦解决了,我的还没解决!
继续找
方案2 
先查看 /etc/rc.d/init.d/mysqld status 看看m y s q l 是否已经启动.
另外看看是不是权限问题.
------------------------------------------------------------------------------------
[root@localhost beinan]#chown -R mysql:mysql /var/lib/mysql
[root@localhost beinan]# /etc/init.d/mysqld start
启动 MySQL: [ 确定 ]
[root@localhost lib]# mysqladmin -uroot password '123456'
[root@localhost lib]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 3 to server version: 4.1.11
Type 'help;' or '/h' for help. Type '/c' to clear the buffe
他的也解决了,我的麻烦还在继续,依然继续寻找
方案3 
问题解决了,竟然是max_connections=1000 他说太多了,然后改成500也说多,无奈删之问题解决了。
还是不行
方案4
     /var/lib/mysql 所有文件权限 改成mysql.mysql
     不行不行
 
方案5
     摘要:解决不能通过mysql .sock连接MySQL问题 这个问题主要提示是,不能通过 '/tmp/mysql .sock'连到服务器,而php标准配置正是用过'/tmp/mysql .sock',但是一些mysql 安装方法 将 mysql .sock放在/var/lib/mysql .sock或者其他的什么地方,你可以通过修改/etc/my.cnf文件来修正它,打开文件,可以看到如下的东东: 
   [mysql d] 
  socket=/var/lib/mysql .sock 
  改一下就好了,但也会引起其他的问题,如mysql 程序连不上了,再加一点: 
  [mysql ] 
  socket=/tmp/mysql .sock 
  或者还可以通过修改php.ini中的配置来使php用其他的mysql .sock来连,这个大家自己去找找
  
  或者用这样的方法:
  ln -s /var/lib/mysql /mysql .sock /tmp/mysql .sock
成功了,就是这样ln -s /var/lib/mysql /mysql .sock /tmp/mysql .sock
OK!
但我的系统中没有找到mysql.sock文件,只有mysqld.sock文件,/var/run/mysqld/mysqld.sock
于是仿照上面的做法: ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
这样,可以正常连接数据库了
再附一篇相关文章:(http://blog.chinaunix.net/u1/43706/showart_351145.html)
mysql_real_connect()试图建立到运行host的一个MySQL数据库引擎的一个连接。其函数原形为:
   MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)
mysql,mysqldump,mysqldump,php连接mysql服务常会提示下面错误:
| 1 | 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 2 3 4 5 6 7 8 | # 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文件而引发此错误。
解决办法:
下面是解决方法,更详细的介绍可以参考:http://aiezu.com/article/mysql_cant_connect_through_socket.html
1、mysql服务未正常运行:
如果是服务未启动,我们运行“service mysqld start”启动服务即可。如果服务启动不了,就去查看mysql服务日志,寻找原因并解决再启动
| 1 2 3 4 5 6 7 | [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文件路径完全一致。如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 | [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文件即可,如:
| 1 2 3 | [MySQL] ...省略n行... mysql.default_socket = "/storage/db/mysql/mysql.sock" | 
4、python连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:
在连接mysql数据库函数中指定socket文件,如下:
| 1 2 3 4 5 6 7 8 | #!/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文件的位置即可,如下:
| 1 2 3 4 5 6 7 8 | <?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); } ?> | 
Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory解决方法的更多相关文章
- Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] No such file or directory'
		1.根本原因在http://askubuntu.com/questions/606732/php-fatal-error-uncaught-exception-pdoexception-with-me ... 
- Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory
		执行下面的代码报错: $pdo = new PDO('mysql:dbname=db_test;host=localhost', 'root', '123456'); PHP Fatal error: ... 
- [PDOException]     SQLSTATE[HY000] [2002] No such file or directory
		编译安装PHP7之后,在安装mysql之后,用pdo操作数据库的时候,出现了此错误[PDOException] SQLSTATE[HY000] [2002] No such file or direc ... 
- laravel 报错SQLSTATE[HY000] [2002] No such file or directory
		在mac中执行php artisan migrate时报错 SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from i ... 
- TP连接数据库报错:SQLSTATE[HY000] [2002] No such file or directory
		连接数据库报错:“SQLSTATE[HY000] [2002] No such file or directory”. 出现这个问题的原因是PDO无法找到mysql.sock或者mysqld.soc ... 
- YII 错误 SQLSTATE[HY000] [2002] No such file or directory
		在使用yii的yii\db\Connnection时发生错误 <?php namespace app\controllers; use yii\web\Controller; use yii\d ... 
- PHP连接MySQL的时候报错SQLSTATE[HY000] [2002] No such file or directory
		错误环境:Mac OS 10.10 找到mysql.sock文件的位置 $sudo find / -name mysql.sock ------结果如下---------- find: /dev/fd ... 
- 【不积跬步,无以致千里】安装roundcube 时出现 “DSN (write):  NOT OK(SQLSTATE[HY000] [2002] No such file or directory)”
		国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ... 
- SQLSTATE[HY000] [2002] No such file or directory in
		这个错误将数据库配置信息的localhost改成127.0.0.1就行了 
随机推荐
- std::ostringstream 转std::string
			http://www.cplusplus.com/reference/sstream/ostringstream/ https://en.cppreference.com/w/cpp/io/basic ... 
- 微软 codeplex 团队
			http://www.codeplex.com/site/users/view/Microsoft 
- 项目清理和删除svn信息(转)
			svn信息是根据文件夹里面的 .svn 文件夹保存相关配置的,删除此文件夹即可去掉svn信息: linux下: find . -type d -name ".svn"|xargs ... 
- java 资料必备
			学习java个人以为必备的资料很多,边上课,边总结: 1.jdk API这个是必须的,什么资料都没有这个权威 2. javaJAVA 2核心技术7th 3. BJava就业培训教程张孝祥 4. thi ... 
- hdu1853 Cyclic Tour (二分图匹配KM)
			Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ... 
- linux系统下file使用的magic文件格式说明
			magic 本手册是file命令所使用的magic文件的格式说明文档,版本是5.04. file命令用于识别文件类型,其他检测,检测文件内容中是否符合 'magic模式',也就是规则. /usr/sh ... 
- java数据结构和算法08(B树的简单原理)
			这一篇首先会说说前面剩余的一点知识2-3树,然后简单说说B树,不写代码,只是简单看看原理吧! 为什么要说一下2-3树呢?了解2-3树之后能更快的了解B树: 1.简单看看2-3树 其实我们学过了前面的2 ... 
- excel常用函数之find,left,right,mid,len
			mid =MID(A2,FIND("时间",A2)+2,10) 第一个 : 提取对象 第二个: 开始位置 第三个: 提取多少 find =FIND(“时间”,A2,1) 第一个: ... 
- 3dmax 法线重置
			从一个模型分离部位时,分离出的部分,面法线发生了混乱,左边原始模型,右边分离后 重置法线方法 对模型(比如对分离出的下半身)添加 EditoNormal修改器 选中模型部位 添加Edit Normal ... 
- jzoj6001. 【PKUWC2019模拟2019.1.15】Mines (tarjan)
			题面 题解 我们把每个地雷向它能炸到的地雷连边,不难发现同一个强联通分量里的点只要一个炸全炸 那么我们缩点,首先所有入度为\(0\)的强联通分量中必须得选一个地雷炸掉,而入度不为\(0\)的强联通分量 ... 
