MySQL 客戶端預設讀取 /tmp/mysql.sock 與本地伺服器通訊,但實際 socket 檔案位置可能在 /var/lib/mysql/mysql.sock、/var/run/mysqld/mysqld.sock 等,路徑不一致導致連線失敗。
# 編輯 /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
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
防止 /tmp 定期清理導致 socket 消失:
chmod +t /tmp # 設定 sticky bit,只有擁有者/root 可刪除
mysql -u root -p -S /var/lib/mysql/mysql.sock
mysqldump -u root -p -S /var/lib/mysql/mysql.sock dbname > backup.sql
; 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。
# 方法 1:查詢變數
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"
# 方法 2:查詢進程啟動參數
ps aux | grep mysqld | grep -o 'socket=[^ ]*'
/tmp 掛載 tmpfs 重啟後內容消失,軟連結會失效,建議方案 1 為主。