ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104 / 111
或執行長查詢/管理命令 (如 STOP SLAVE) 時隨機中斷。
| 原因 | 現象 | 解決 |
|---|---|---|
| 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、優化慢查詢、連線池配置 |
| 原因 | 現象 | 解決 |
|---|---|---|
| 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 |
許多「詭異」的 2013 錯誤源於 MySQL 預設嘗試對客戶端 IP 做反向 DNS 解析 (獲取主機名用於權限匹配、日誌)。解析失敗/超時導致握手階段中斷。
# /etc/my.cnf
[mysqld]
skip-name-resolve
# 重啟生效
systemctl restart mysqld
副作用: 權限表 mysql.user 的 Host 欄不再支援主機名,只能用 IP 或通配符 %。現有主機名帳號需遷移為 IP。
telnet 3306 / nc -zv 3306 測試埠口連通性。mysql -h -u root -p --connect-timeout=10 觀察具體階段卡住。tail -f /var/log/mysqld.log 或 /var/lib/mysql/hostname.err。tcpdump -i eth0 -nn port 3306 -w mysql.pcap → Wireshark 觀察 TCP 握手、MySQL 協議包。SHOW GLOBAL STATUS LIKE 'Aborted_connects'; 計數暴增確認連線異常中斷。testOnBorrow=true、validationQuery=SELECT 1。connectTimeout、socketTimeout (建議 ≥ 30s)。