錯誤 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 表示客戶端找不到 Unix Domain Socket 檔案。原因通常是:**服務未啟動、Socket 路徑不一致、權限問題、配置檔讀取順序錯誤**。本文提供 5 級排查方案,由簡入繁。
mysql -u root -p
# ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
# 檢查進程
ps -ef | grep mysqld
# 無輸出 = 服務未跑
# 系統服務管理
systemctl status mysqld # CentOS 7+/RHEL 7+
service mysql status # CentOS 6/Ubuntu 14.04-
systemctl start mysqld # 或 service mysql start
# 若掛載點滿、權限錯誤導致啟動失敗,查看錯誤日誌
tail -50 /var/log/mysqld.log # 或 /var/log/mysql/error.log
MySQL 編譯預設 /tmp/mysql.sock,但許多套件 (RPM/DEB/源碼安裝) 放在 /var/lib/mysql/mysql.sock 或 /var/run/mysqld/mysqld.sock。客戶端讀取 [client] 區段的 socket 參數。
# 1. 找出實際 socket 位置
find / -name "mysql.sock" -o -name "mysqld.sock" 2>/dev/null
# 輸出範例:/var/run/mysqld/mysqld.sock
# 2. 修改 /etc/my.cnf (或 /etc/mysql/my.cnf)
[mysqld]
socket = /var/run/mysqld/mysqld.sock
[client]
socket = /var/run/mysqld/mysqld.sock
# 3. 重啟服務
systemctl restart mysqld
快速臨時修法:建立軟連結指向客戶端預期路徑:
ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
# 立即生效,無需重啟
# Socket 目錄與檔案必須屬於 mysql 用戶
chown -R mysql:mysql /var/run/mysqld
chown -R mysql:mysql /var/lib/mysql
# 目錄權限 755,socket 檔案 660
chmod 755 /var/run/mysqld
chmod 660 /var/run/mysqld/mysqld.sock
MySQL 讀取配置檔順序:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/etc/my.cnf
~/.my.cnf
若多實例共用 /etc/my.cnf 但各實例 mysqld_multi 或 systemd 傳遞 --defaults-file 不同,導致 socket 參數不一致。解決:
--defaults-file=/etc/my.cnf.3306。mysql -S /var/run/mysqld/mysqld.sock -u root -p。# 暫時關閉 SELinux 驗證
setenforce 0
# 或永久修改 /etc/selinux/config: SELINUX=permissive
# AppArmor (Ubuntu/Debian)
aa-status | grep mysql
# 若處於 enforce,修改 /etc/apparmor.d/usr.sbin.mysqld 添加 socket 目錄權限
| 檢查項 | 指令 | 預期 |
|---|---|---|
| 服務進程 | ps -ef | grep mysqld | 有 mysqld 主進程 |
| Socket 存在 | ls -l /var/run/mysqld/mysqld.sock | srwxrwxrwx mysql:mysql |
| 配置一致 | grep socket /etc/my.cnf /etc/mysql/my.cnf | mysqld/client 同一路徑 |
| 本地連線 | mysql -S /var/run/mysqld/mysqld.sock -u root -p | 成功進入 mysql> |
| TCP 連線 | mysql -h 127.0.0.1 -u root -p | 成功 (繞過 socket) |
-h 127.0.0.1。/tmp 定期清理 (systemd-tmpfiles) 會刪除 socket,導致重啟前正常、重啟後失敗 → **不要把 socket 放在 /tmp**。mysql_upgrade 可能重置配置,重啟前務必核對 socket 參數。