MySQL 啟動正常但客戶端無法透過 Socket 連接,報錯 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/path/mysql.sock' (111),是運維常見故障。本文從故障現象、根因分析、多種解決方案三個維度,系統梳理排查思路與修復方法。
[root@SZDB mysqldata]# mysql -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysqldata/mysql.sock' (111)
# 環境資訊
[root@SZDB mysqldata]# cat /etc/issue
CentOS release 5.9 (Final)
核心矛盾:MySQL 服務端實際創建的 socket 檔案路徑,與客戶端預期尋找的路徑不一致。
# 1. 確認服務已啟動並監聽端口
[root@SZDB mysqldata]# netstat -ntlp | grep 3306
tcp 0 0 :::3306 :::* LISTEN 13001/mysqld
# 2. 檢查配置檔中 socket 定義
[root@SZDB mysqldata]# grep socket /etc/my.cnf
socket = /tmp/mysql.sock
# 3. 錯誤提示尋找路徑為 /data/mysqldata/mysql.sock
# 結論:my.cnf 定義 /tmp/mysql.sock,但客戶端預設讀取 /data/mysqldata/mysql.sock
# 原因:客戶端未讀取到正確的 my.cnf,或編譯時預設路徑不同
錯誤日誌驗證服務端實際 socket:
[root@SZDB mysqldata]# grep socket SZDB.err
Version: '5.6.12-log' socket: '/tmp/mysql.sock' port: 3306
# 服務端確實使用 /tmp/mysql.sock
在 /etc/my.cnf 的 [mysql] 客戶端區段明確指定 socket:
[root@SZDB mysqldata]# service mysqld stop
Shutting down MySQL.[ OK ]
[root@SZDB mysqldata]# vi /etc/my.cnf
# 在 [mysql] 區段添加
[mysql]
no-auto-rehash
socket = /tmp/mysql.sock
[root@SZDB mysqldata]# service mysqld start
Starting MySQL..[ OK ]
[root@SZDB mysqldata]# mysql -uroot -p
Enter password:
mysql> SHOW VARIABLES LIKE 'version';
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| version | 5.6.12-log |
+---------------+------------+
[root@SZDB mysqldata]# ln -s /tmp/mysql.sock /data/mysqldata/mysql.sock
ln: creating symbolic link '/data/mysqldata/mysql.sock' to '/tmp/mysql.sock': File exists
[root@SZDB mysqldata]# rm /data/mysqldata/mysql.sock # 移除舊檔/殘留檔
[root@SZDB mysqldata]# ln -s /tmp/mysql.sock /data/mysqldata/mysql.sock
[root@SZDB mysqldata]# ls -l /data/mysqldata/mysql.sock
lrwxrwxrwx 1 root root 15 Oct 11 14:00 /data/mysqldata/mysql.sock -> /tmp/mysql.sock
[root@SZDB mysqldata]# mysql -uroot -p
Enter password:
mysql> SHOW VARIABLES LIKE 'socket';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| socket | /tmp/mysql.sock |
+---------------+-----------------+
mysql -uroot -p -S /tmp/mysql.sock
# 或使用 TCP 繞過 socket
mysql -uroot -p -h 127.0.0.1 --protocol=tcp
cat > ~/.my.cnf <
| 檢查項目 | 命令/方法 | 正常預期 |
|---|---|---|
| 服務進程狀態 | ps -ef | grep mysqld | 存在 mysqld 主進程 |
| 端口監聽 | netstat -ntlp | grep 3306 | LISTEN 狀態 |
| 錯誤日誌 | tail -50 /var/log/mysqld.log | 無嚴重 ERROR,顯示正確 socket 路徑 |
| 配置檔 socket 一致性 | grep socket /etc/my.cnf | [mysqld] 與 [client]/[mysql] 區段路徑一致 |
| Socket 檔案存在性 | ls -l /tmp/mysql.sock | srwxrwxrwx 權限,mysql 用戶擁有 |
| 目錄權限 | ls -ld /tmp /var/lib/mysql | mysql 用戶可讀寫執行 |
| SELinux/AppArmor | getenforce / aa-status | Permissive 或已放行 mysql |
/var/lib/mysql/mysql.sock:Debian/Ubuntu 預設路徑,檢查 /etc/mysql/my.cnf(111) Connection refused:服務未啟動或端口未監聽,非 socket 路徑問題(2) No such file or directory:socket 檔案確實不存在,服務可能掛起或路徑錯誤Permission denied:socket 檔案權限問題,檢查目錄擁有者與權限/etc/my.cnf 定義,包含 [mysql]、[client]、[mysql] 區段/var/run/mysqld/mysqld.sock掌握「配置一致性」核心原則,即可快速定位並解決 90% 的 Socket 連接故障。建議建立標準化部署清單,避免人為配置差異導致的重複問題。