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 檔案的位置即可,如下:
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 就可以了。