1. 程式人生 > >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解決方法

mouse 正是 from key int stripe 進程 成功 stack

今天用pdo連接mysql遇到一個奇怪的問題,host設為127.0.0.1可以連接成功,設為localhost就會報如下的錯誤:

  1. PHP Fatal error: Uncaught exception ‘PDOException‘ with message ‘SQLSTATE[HY000] [2002] No such file or directory‘ in /usr/share/nginx/html/test.php:2
  2. Stack trace:
  3. #0 /usr/share/nginx/html/test.php(2): PDO->__construct(‘mysql:host=loca...‘, ‘root‘, ‘aaaaaa‘)
  4. #1 {main}
  5. 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

  1. 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 是否已經啟動.
另外看看是不是權限問題.
------------------------------------------------------------------------------------
[[email protected] beinan]#chown -R mysql:mysql /var/lib/mysql
[[email protected] beinan]# /etc/init.d/mysqld start
啟動 MySQL: [ 確定 ]
[[email protected] lib]# mysqladmin -uroot password ‘123456‘
[[email protected] 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數據庫。我在數據庫的本機上做試驗,發現mysql_real_connect()的第二個參數設為"localhost"時可以正常連接,當改寫為該機器的IP地址"192.168.100.2"時就連接失敗。我在程序中寫的原句為: mysql_real_connect(mysql,"192.168.100.2","root","","mydns",0,NULL,0)。 最初,我以為將"localhost"改為"192.168.100.2"之後要將第六個參數端口號寫上,但還是不行。由於我是在Linux上做的,所以想也許需要將第七個參數unix_socket寫上,結果還是不行。於是到google找解決方法,發現要遠程連接mysql需要為mysql的指定帳號設置遠程連接的權限。在我的程序中,就要為root設置這一權限。事實證明,我之前連接失敗正是由於這個原因導致的。但問題是,網上被廣泛轉貼的方法是錯誤的,我照做後還不行,最後問了同學才解決的。下面我具體說一下,望大家不會再被誤導。 在mysql數據庫中有一個mysql庫,它裏面包含一個user表,裏面存有所有帳號及它們的權限及特征。對應我的user表中找到User項為root的,發現有兩項,其Host項分別為localhost和localhost.localdomain。我們只需要把‘localhost‘改為‘%‘就可以讓所有遠程機器以root帳號登陸mysql服務器。也可以將‘localhost‘改為某一個ip地址,這樣就可以在該地址的機器上登陸mysql服務器。這些都沒有問題,只是網上被廣為傳頌的一個更改Host項的方法是錯誤的。他的方法是用update語句將指定User項的Host項改過來,如果想添加一個新的用於遠程訪問的帳號,就用insert語句添加。事實是這根本不行,我按照作了,表是變了,但還是連不上。後來經過詢問才知道,要想改,結合我的情況,必須用下面的這條語句: grant all privileges on mydns.* to ‘root‘@‘%‘; 來改變root帳號的權限。如果添加新帳號也是如此。想必這個表比較特殊,用普通的SQL語句不能操作。如果帳號有密碼,後面再加上identified by ‘***‘(*為你帳號的密碼)就可以了。 為了解決這個問題用了一下午的時間,費了不少周折,寫出來也能讓大家少走些彎路。 第三種文章:

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, &#039;root&#039;, &#039;&#039;); $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解決方法