SQL Error (2013): Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0
客戶端(如 HeidiSQL、Navicat、命令行)連接虛擬機/遠程 MySQL 時,等待 1-2 分鐘後拋出。非認證失敗,而是**握手階段超時**。
gethostbyaddr(client_ip) 反向 DNS 解析主機名connect_timeout (默認 10s) → 斷開連接,拋 2013 錯誤[mysqld] # 禁用 DNS 反向解析 skip-name-resolve # 可選:若需主機名授權,手動維護 /etc/hosts # 192.168.1.100 app-server-01
# 重啟服務 systemctl restart mysqld # 或 service mysql restart
| 影響 | 說明 | 應對 |
|---|---|---|
| 授權表 Host 列 | 不再支援主機名,只能用 IP/通配符 % | 授權時用 IP:GRANT ... TO 'user'@'192.168.1.%' |
| SHOW PROCESSLIST | Host 列顯示 IP 而非主機名 | 運維適應即可,無實質影響 |
| 日志審計 | 審計日志記錄 IP | 配合 IP 資產管理系統關聯 |
[mysqld] # 跳過權限檢查(僅用於密碼重置緊急維護) # skip-grant-tables # 兩者區別: # skip-name-resolve → 禁用 DNS 解析(網絡層優化,生產可長期開啟) # skip-grant-tables → 禁用權限驗證(安全風險極大,僅維護窗口臨時開啟)
| 原因 | 排查命令 | 解決 |
|---|---|---|
| max_allowed_packet 過小 | SHOW VARIABLES LIKE 'max_allowed_packet'; | 增大至 64M/1G |
| wait_timeout / interactive_timeout 過短 | SHOW VARIABLES LIKE '%timeout'; | 調大至 28800 (8h) |
| 防火牆/安全組截斷長連接 | tcpdump 抓包分析 | 調整防火牆保活/心跳 |
| 服務器負載過高拒絕連接 | top / SHOW PROCESSLIST | 擴容/限流/優化慢查詢 |
| SSL 握手失敗 | 客戶端/服務端 SSL 配置不匹配 | 統一 SSL 模式或禁用 SSL 連接 |
# 客戶端快速連接測試 time mysql -u root -p -h-e "SELECT 1;" # 應在 1 秒內返回,無長時間等待
skip-name-resolve 是 MySQL 遠程連接優化的**「銀彈」**:一行配置、重啟生效、徹底消除 DNS 阻塞、無業務副作用。所有跨網段、雲上、容器化部署的 MySQL **強烈建議默認開啟**。