PHP 應用拋出錯誤編號 2003:Can't connect to MySQL server on localhost (10061),表示客戶端無法建立到 MySQL 服務端的 TCP 連接。
| 類別 | 具體原因 | 典型特徵 |
|---|---|---|
| 服務端未就緒 | MySQL 服務未啟動或異常停止 | 服務列表中顯示 Stopped;error.log 記錄啟動失敗 |
| 配置錯誤導致啟動失敗 | my.ini 中 basedir/datadir 路徑錯誤、磁碟空間耗盡、端口衝突 | |
| 資源耗盡 | 連接數超過 max_connections | 高峰期突發,錯誤日志出現 "Too many connections" |
| 網絡層阻隔 | 防火牆攔截 3306 端口、bind-address 綁定錯誤 | 本地連接正常,遠程失敗;或 localhost 解析異常 |
| Windows 系統特有 | TIME_WAIT 狀態連接堆積耗盡端口 | 高併發短連接場景,刷新後偶爾恢復正常 |
localhost、127.0.0.1 或特定 Socket 路徑Windows:services.msc → 找到 MySQL → 狀態應為「正在運行」;或命令行 sc query mysql
Linux:systemctl status mysqld 或 service mysql status;若未運行執行 service mysql start
df -h # Linux
# 關注 /var/lib/mysql 掛載點,剩餘空間應 > 10%
空間不足時清理舊日志、臨時文件或擴容磁碟。
[mysqld]
basedir = C:/mysql-5.7 # 安裝目錄,需與實際一致
datadir = C:/mysql-5.7/data # 數據目錄
port = 3306
bind-address = 0.0.0.0 # 允許遠程連接,本地只需 127.0.0.1
skip-name-resolve # 禁用 DNS 反解,加快連接(見避坑指南)
修改後必須 service mysql restart 生效。
現象:高併發短連接導致大量 TIME_WAIT 佔用端口,新連接建立失敗。
解決:修改註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
TcpTimedWaitDelay(默認 240 秒)
telnet 127.0.0.1 3306 或 mysql -h127.0.0.1 -uroot -p(強制 TCP 而非 Socket)tail -f /var/log/mysqld.log 定位具體啟動失敗原因mysql.user 表中存在 'root'@'localhost' 和 'root'@'127.0.0.1' 賬號關於 skip-name-resolve:開啟後 MySQL 不再進行 DNS 反向解析,連接速度顯著提升,但會導致
'user'@'localhost'賬號無法匹配(解析為'user'@'127.0.0.1')。
對策:同步創建'user'@'127.0.0.1'賬號並授權,或保留localhost解析並在 hosts 文件中硬編碼127.0.0.1 localhost。
按順序排查,90% 的 2003 錯誤可在 5 分鐘內定位解決。