萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL "Can't connect to local MySQL server through socket /tmp/mysql.sock" 徹底解決

錯誤根因

MySQL 客戶端預設讀取 /tmp/mysql.sock 與本地伺服器通訊,但實際 socket 檔案位置可能在 /var/lib/mysql/mysql.sock、/var/run/mysqld/mysqld.sock 等,路徑不一致導致連線失敗。

解決方案(按推薦順序)

方案 1:統一配置文件指定 socket 路徑(最標準)

# 編輯 /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock

[mysql]
socket=/var/lib/mysql/mysql.sock

[mysqladmin]
socket=/var/lib/mysql/mysql.sock

重啟 MySQL:systemctl restart mysqld

方案 2:建立軟連結(最快臨時修復)

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

防止 /tmp 定期清理導致 socket 消失:

chmod +t /tmp   # 設定 sticky bit,只有擁有者/root 可刪除

方案 3:客戶端指定 socket 參數

mysql -u root -p -S /var/lib/mysql/mysql.sock
mysqldump -u root -p -S /var/lib/mysql/mysql.sock dbname > backup.sql

方案 4:PHP 修改預設 socket

; php.ini
mysql.default_socket = /var/lib/mysql/mysql.sock
mysqli.default_socket = /var/lib/mysql/mysql.sock
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock

修改後需重啟 PHP-FPM/Apache。

驗證當前 socket 位置

# 方法 1:查詢變數
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"

# 方法 2:查詢進程啟動參數
ps aux | grep mysqld | grep -o 'socket=[^ ]*'

常見坑點

  • 多 MySQL 實例運行時,每個實例需獨立 socket 路徑,客戶端必須指定對應 socket。
  • Docker 容器內 socket 路徑與宿主機不同,掛載卷時需對應。
  • /tmp 掛載 tmpfs 重啟後內容消失,軟連結會失效,建議方案 1 為主。
copyright © 萬盛學電腦網 all rights reserved