錯誤 Can't connect to MySQL server on localhost (10061) 表示**客戶端無法建立 TCP 連線到 3306 端口**。本文提供從網路、服務、配置、權限、防火牆、Windows 補丁等全維度排查清單,助你快速定位根因。
WSAECONNREFUSED — 目標端口無監聽進程,連線被拒絕。ECONNREFUSED — 同義。
# Windows
net start mysql
sc query mysql
# Linux
systemctl status mysqld
service mysql status
ps aux | grep mysqld
❌ 未運行 → systemctl start mysqld / net start mysql。
✅ 運行中 → 繼續下一步。
# Windows
netstat -an | findstr 3306
# Linux
netstat -an | grep 3306
ss -ltn | grep 3306
❌ 無 LISTEN → 檢查 my.cnf port、bind-address、錯誤日誌。
✅ 有 LISTEN → 繼續下一步。
| 主機參數 | 傳輸協議 | MySQL 權限匹配 |
|---|---|---|
localhost | Unix Socket (Linux) / Named Pipe / Shared Memory (Windows) | user@'localhost' |
127.0.0.1 | TCP/IP | user@'127.0.0.1' 或 user@'%' |
localhost 連不上,127.0.0.1 能連。127.0.0.1(推薦,跨平台一致)。ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock(Linux)。my.cnf 統一 socket 路徑並重啟。protocol=tcp 強制走 TCP。
# my.cnf / my.ini
[mysqld]
bind-address = 127.0.0.1 # 僅本機 TCP 連線
# bind-address = 0.0.0.0 # 監聽所有介面(含遠程)
# bind-address = :: # IPv6
0.0.0.0 或具體 IP,**並重啟 MySQL**。CREATE USER 'user'@'%' IDENTIFIED BY 'pass'; 或 'user'@'192.168.1.%'。
# Linux firewalld
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
# Linux iptables
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# Windows 防火牆
netsh advfirewall firewall add rule name="MySQL 3306" dir=in action=allow protocol=TCP localport=3306
# 雲廠商安全組:入站規則開放 3306(僅授信 IP/安全組)
tcp_tw_reuse、擴大端口範圍、應用層改長連線池。
mysql -u root -p # 能用 root 登入代表服務正常
mysql> SELECT user, host FROM mysql.user WHERE user='your_user';
# 確認 host 匹配:'%'、'localhost'、'127.0.0.1'、具體 IP
mysql> FLUSH PRIVILEGES;
無法連線
│
├─> 服務未啟動? ──Y──> 啟動服務
│ │
│ N
│ ▼
├─> 3306 無 LISTEN? ──Y──> 檢查 my.cnf port/bind-address/error.log
│ │
│ N
│ ▼
├─> 用 127.0.0.1 能連? ──Y──> Socket 問題 → 改用 127.0.0.1 / 修復 socket / protocol=tcp
│ │
│ N
│ ▼
├─> 防火牆/安全組阻擋? ──Y──> 開放 3306
│ │
│ N
│ ▼
├─> 用戶 host 權限不匹配? ──Y──> CREATE USER 'u'@'%' / GRANT ...
│ │
│ N
│ ▼
└─> 端口耗盡 / 內核參數? ──Y──> 調優 tcp_tw_reuse / 連線池
# TCP 連線測試
telnet 127.0.0.1 3306
nc -zv 127.0.0.1 3306
# MySQL 客戶端測試
mysql -h 127.0.0.1 -u user -p
mysql -h localhost -u user -p --protocol=tcp