萬盛學電腦網

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

MySQL 無法連接「Can't connect to MySQL server on localhost (10061)」完整排查手冊

錯誤 Can't connect to MySQL server on localhost (10061) 表示**客戶端無法建立 TCP 連線到 3306 端口**。本文提供從網路、服務、配置、權限、防火牆、Windows 補丁等全維度排查清單,助你快速定位根因。

錯誤代碼含義

  • 10061 (Windows):WSAECONNREFUSED — 目標端口無監聽進程,連線被拒絕。
  • 111 (Linux):ECONNREFUSED — 同義。

快速排查清單(按可能性排序)

1. MySQL 服務是否運行?


# Windows
net start mysql
sc query mysql

# Linux
systemctl status mysqld
service mysql status
ps aux | grep mysqld

❌ 未運行 → systemctl start mysqld / net start mysql。
✅ 運行中 → 繼續下一步。

2. 端口 3306 是否在監聽?


# Windows
netstat -an | findstr 3306

# Linux
netstat -an | grep 3306
ss -ltn | grep 3306

❌ 無 LISTEN → 檢查 my.cnf port、bind-address、錯誤日誌。
✅ 有 LISTEN → 繼續下一步。

3. 連線方式:localhost vs 127.0.0.1(關鍵差異)

主機參數傳輸協議MySQL 權限匹配
localhostUnix Socket (Linux) / Named Pipe / Shared Memory (Windows)user@'localhost'
127.0.0.1TCP/IPuser@'127.0.0.1' 或 user@'%'
  • **現象**:localhost 連不上,127.0.0.1 能連。
  • **原因**:Socket 檔案缺失/路徑錯誤/權限不足/命名管道未啟用。
  • **解決**:
    1. 應用配置改用 127.0.0.1(推薦,跨平台一致)。
    2. 或修復 Socket:ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock(Linux)。
    3. 或 my.cnf 統一 socket 路徑並重啟。
    4. 或客戶端配置 protocol=tcp 強制走 TCP。

4. bind-address 綁定地址限制


# 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.%'。

5. 防火牆/安全組阻攔


# 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/安全組)

6. Windows 特有:KB967723 補丁導致連線失敗

  • 現象:安裝該補丁後 MySQL 服務正常但無法連線。
  • 解決:控制面板 → 程式和功能 → 查看已安裝的更新 → 找到 KB967723 → 解除安裝 → 重啟。

7. 端口耗盡(大量 TIME_WAIT)

  • 參考 文章 178757:調整 tcp_tw_reuse、擴大端口範圍、應用層改長連線池。

8. 權限表問題


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
copyright © 萬盛學電腦網 all rights reserved