首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 連接報錯 SQL Error (2013) 解決方案:skip-name-resolve 參數深度解析

     編輯:MySQL 資料庫相關知識

錯誤現象

SQL Error (2013): Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0

客戶端(如 HeidiSQL、Navicat、命令行)連接虛擬機/遠程 MySQL 時,等待 1-2 分鐘後拋出。非認證失敗,而是**握手階段超時**。

根因分析:DNS 反向解析阻塞

  1. 客戶端發起 TCP 連接
  2. MySQL Server 接受連接,獲取客戶端 IP
  3. 默認行為:執行 gethostbyaddr(client_ip) 反向 DNS 解析主機名
  4. 若 DNS 服務器不可達/慢/無 PTR 記錄 → 解析阻塞/超時
  5. 超過 connect_timeout (默認 10s) → 斷開連接,拋 2013 錯誤

解決方案:skip-name-resolve

配置文件修改

[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 PROCESSLISTHost 列顯示 IP 而非主機名運維適應即可,無實質影響
日志審計審計日志記錄 IP配合 IP 資產管理系統關聯

相關參數:skip-grant-tables(區別!)

[mysqld]
# 跳過權限檢查(僅用於密碼重置緊急維護)
# skip-grant-tables

# 兩者區別:
# skip-name-resolve  →  禁用 DNS 解析(網絡層優化,生產可長期開啟)
# skip-grant-tables  →  禁用權限驗證(安全風險極大,僅維護窗口臨時開啟)

其他可能導致 2013 的原因

原因排查命令解決
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 **強烈建議默認開啟**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved