萬盛學電腦網

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

MySQL Can't connect to MySQL server (10060/10061/2003) 常見連接失敗排查全攻略

MySQL 連接失敗是運維與開發最常遇到的問題。本文系統梳理錯誤碼 10060(連接超時)、10061(連接被拒絕)、2003(無法連接到服務器)的根因、排查步驟、解決方案與預防措施,助你快速定位恢復。

一、錯誤碼含義速查

錯誤碼訊息核心含義典型原因
10060Can't connect to MySQL server (10060)連接超時網路不通、防火牆攔截、MySQL 未監聽該 IP/Port
10061Can't connect to MySQL server on 'localhost' (10061)連接被拒絕MySQL 服務未啟動、監聽地址錯誤、端口衝突
2003Can't connect to MySQL server on 'host' (2003)無法連接到服務器綜合錯誤,含以上兩種、DNS 解析失敗、客戶端庫版本不匹配

二、分層排查步驟(由網路到應用)

Layer 1:網路連通性

# 1. Ping 測試
ping 192.168.1.100

# 2. 端口連通性
telnet 192.168.1.100 3306
# 或 PowerShell
Test-NetConnection 192.168.1.100 -Port 3306
# 或 Linux
nc -zv 192.168.1.100 3306

❌ 不通 → 檢查防火牆、安全組、VPN、網段路由。

Layer 2:MySQL 服務狀態

# Windows
net start mysql
sc query mysql

# Linux
systemctl status mysqld
systemctl start mysqld

# 檢查進程與端口
netstat -antp | grep 3306
ss -antlp | grep 3306

❌ 服務未運行 → 查看錯誤日誌 tail -f /var/log/mysqld.log 或 Windows 事件查看器。

Layer 3:MySQL 監聽配置

# 檢查配置文件
grep -n "bind-address" /etc/my.cnf
# bind-address = 127.0.0.1  # 僅本地
# bind-address = 0.0.0.0    # 監聽所有介面 (推薦生產)
# bind-address = 192.168.1.100  # 指定 IP

修改後**必須重啟 MySQL**。

Layer 4:防火牆/安全組

# Linux firewalld
firewall-cmd --permanent --add-port=3306/tcp
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)

Layer 5:用戶權限與認證

# 1. 檢查用戶宿主
SELECT User, Host, plugin FROM mysql.user WHERE User='root';

# 2. 允許遠程連接 (MySQL 8.0+)
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass#2024';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

# 或修改現有用戶 Host
UPDATE mysql.user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

⚠️ **生產環境禁用 root 遠程登入**,創建專用應用賬號、限制來源 IP、強密碼。

Layer 6:客戶端/驅動問題

  • Authentication plugin 錯誤: 升級驅動或用戶指定 mysql_native_password。
  • SSL/TLS 協商失敗: 連線字串加 SslMode=Preferred 或 SslMode=None(測試環境)。
  • IPv6 vs IPv4: Windows localhost 解析為 ::1,MySQL 未監聽 IPv6。改用 127.0.0.1 或配置 bind-address = ::。

三、快速修復腳本(Windows Bat)

@echo off
echo ==== MySQL 連接診斷 ====
echo 1. 檢查服務...
net start | find "MySQL" >nul && echo [OK] MySQL 服務運行中 || (echo [ERR] 服務未啟動 & net start mysql)

echo 2. 檢查端口...
netstat -an | find "3306" >nul && echo [OK] 3306 端口監聽中 || echo [ERR] 3306 未監聽

echo 3. 測試本地連接...
mysql -u root -p -e "SELECT 1;" >nul 2>&1 && echo [OK] 本地連接正常 || echo [ERR] 本地連接失敗

echo 4. 檢查 bind-address...
type "C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" | find "bind-address"

pause

四、預防與最佳實踐

  1. 監控告警: 監控 Threads_connected、Aborted_connects、服務存活、端口存活。
  2. 連線池配置: 應用層啟用連線池、設置合理 wait_timeout、max_connections。
  3. 最小權限: 應用賬號僅授予所需庫表權限、限制 Host。
  4. 定期演練: 模擬網路中斷、服務重啟、主從切換,驗證應用自動重連機制。

五、總結

MySQL 連接失敗 90% 是 **網路/防火牆/bind-address/服務狀態** 問題。按「網路 → 服務 → 配置 → 防火牆 → 權限 → 客戶端」六層排查,通常 5 分鐘內定位。**生產環境務必:監聽 0.0.0.0、專用賬號、限制來源 IP、啟用 SSL、配置連線池、建立監控告警。**

copyright © 萬盛學電腦網 all rights reserved