首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL ERROR 2013 (HY000) 連線中斷徹底排查與解決

     編輯:MySQL 綜合教學

錯誤現象

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104 / 111

或執行長查詢/管理命令 (如 STOP SLAVE) 時隨機中斷。

常見原因分類

1. 連線建立階段斷開 (reading initial communication packet)

原因現象解決
skip-name-resolve 缺失DNS 反向解析慢/失敗導致握手超時my.cnf [mysqld] 加入 skip-name-resolve,重啟
防火牆/安全組攔截SYN 到達但無回應,或連線建立後被斷開放 3306 入站,檢查 iptables/security group/云廠商防火牆
bind-address 錯誤僅監聽 127.0.0.1,遠程無法連線設定 bind-address = 0.0.0.0 或具體內網 IP
SSL/TLS 握手失敗強制 SSL 但客戶端不支援/憑證錯誤客戶端指定 --ssl-mode=DISABLED 或修正憑證
max_connections 耗盡新連線被拒,錯誤 1040/2013調大 max_connections、優化慢查詢、連線池配置

2. 查詢執行階段斷開 (during query)

原因現象解決
net_read_timeout / net_write_timeout 過小大結果集/慢查詢傳輸超時調大:SET GLOBAL net_read_timeout=600; net_write_timeout=600;
max_allowed_packet 過小單行/單包超過限制 (預設 4MB/64MB)SET GLOBAL max_allowed_packet=1073741824; (1GB)
Server 端 OOM Killer 殺死進程系統記憶體不足,mysqld 被殺檢查 dmesg | grep -i kill,調整 innodb_buffer_pool、swap、限制並發
主從切換/故障轉移瞬間寫入新主庫連線重置應用層實現重試邏輯、使用 ProxySQL/Keepalived VIP

3. 系統錯誤碼對照

  • 104 (ECONNRESET): 連線被對端重置 (防火牆、中間設備、Server 端主動關閉)。
  • 111 (ECONNREFUSED): 連線被拒絕 (埠口未監聽、防火牆 REJECT)。
  • 101 (ENETUNREACH): 網路不可達 (路由、VPN、安全組)。
  • 110 (ETIMEDOUT): 連線超時 (SYN 無回應、防火牆 DROP)。

核心解決方案:skip-name-resolve

許多「詭異」的 2013 錯誤源於 MySQL 預設嘗試對客戶端 IP 做反向 DNS 解析 (獲取主機名用於權限匹配、日誌)。解析失敗/超時導致握手階段中斷。


# /etc/my.cnf
[mysqld]
skip-name-resolve
# 重啟生效
systemctl restart mysqld

副作用: 權限表 mysql.user 的 Host 欄不再支援主機名,只能用 IP 或通配符 %。現有主機名帳號需遷移為 IP。

排查檢查清單

  1. telnet 3306 / nc -zv 3306 測試埠口連通性。
  2. mysql -h -u root -p --connect-timeout=10 觀察具體階段卡住。
  3. 查看 Server 錯誤日誌:tail -f /var/log/mysqld.log 或 /var/lib/mysql/hostname.err。
  4. 抓包分析:tcpdump -i eth0 -nn port 3306 -w mysql.pcap → Wireshark 觀察 TCP 握手、MySQL 協議包。
  5. 檢查 SHOW GLOBAL STATUS LIKE 'Aborted_connects'; 計數暴增確認連線異常中斷。

應用層防禦性編程

  • 連線池配置 testOnBorrow=true、validationQuery=SELECT 1。
  • 實現指數退避重試 (如 Hystrix/Resilience4j/Spring Retry)。
  • 設定合理 connectTimeout、socketTimeout (建議 ≥ 30s)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved