Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
# 或
Warning: mysql_connect(): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
核心原因:MySQL 實際建立的 socket 檔路徑 與 客戶端預期路徑 不一致。常見於編譯安裝、套件管理器安裝、多版本共存環境。
--with-unix-socket-path 決定預設 socket 路徑(如 /var/lib/mysql/mysql.sock、/tmp/mysql.sock、/var/run/mysqld/mysqld.sock)。mysql.default_socket、phpMyAdmin $cfg['Servers'][$i]['socket']、MySQL 客戶端庫 mysql_config --socket 若未同步修改,即會去錯誤路徑尋找 socket。[mysqld]
socket = /var/lib/mysql/mysql.sock # 實際路徑
[client]
socket = /var/lib/mysql/mysql.sock # 客戶端預設路徑
[mysql]
socket = /var/lib/mysql/mysql.sock # mysql 命令列專用
修改後 systemctl restart mysql,所有原生客戶端(mysql、mysqladmin、mysqldump)自動生效。
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
# 或反向
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
讓雙方路徑指向同一實體檔,無需重啟服務,但重啟後可能失效(/tmp 可能被清理),建議加入啟動腳本。
; 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
重啟 Apache/PHP-FPM 生效。適用於無法動 my.cnf 的託管環境。
// config.inc.php
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';
僅影響 phpMyAdmin,不影響 CLI 或其他 PHP 應用。
# PHP PDO
$dsn = "mysql:host=localhost;dbname=test;unix_socket=/var/lib/mysql/mysql.sock";
# PHP mysqli
$mysqli = new mysqli('localhost', 'user', 'pass', 'db', 3306, '/var/lib/mysql/mysql.sock');
# Python mysqlclient
conn = MySQLdb.connect(host='localhost', unix_socket='/var/lib/mysql/mysql.sock', ...)
# JDBC (Connector/J 8.0+)
jdbc:mysql://localhost/db?socketFactory=com.mysql.cj.protocol.unix.UnixSocketFactory&unixSocketPath=/var/lib/mysql/mysql.sock
# 方法 1:mysqladmin
mysqladmin -u root -p variables | grep socket
# 方法 2:mysql 命令列
mysql -u root -p -e "SHOW VARIABLES LIKE 'socket';"
# 方法 3:ps 檢查啟動參數
ps aux | grep mysqld | grep -o 'socket=[^ ]*'
socket 變數,確認與預期一致。my.cnf [client] 區段管控,避免多處分散設定。/var/lib/mysql 或 /run/mysqld 為 Volume,socket 自動共享。ls -l /var/lib/mysql/mysql.sock 存在性與權限(mysql:mysql 755)。Socket 路徑不符是 MySQL 部署的「頭號陷阱」,但本質只是路徑約定不一致。掌握 my.cnf 統一配置、軟連結急救、PHP/phpMyAdmin 專屬覆寫 三大招式,並建立「部署後必驗證 socket」檢查清單,即可永久杜絕此類連線故障。