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

解決 MySQL 遠程連線緩慢:skip-name-resolve 禁用 DNS 反解

     編輯:MySQL 資料庫相關知識

現象:區域網路/遠程客戶端連線 MySQL 等待 5-30 秒才出現密碼提示或報錯,但本機 localhost 連線極快。根因:**MySQL 預設對客戶端 IP 執行 DNS 反向解析** (PTR 記錄查詢),無 DNS 伺服器或解析超時導致嚴重延遲。解決方法:在 my.cnf 啟用 skip-name-resolve。

問題重現

# 客戶端連線
time mysql -h 192.168.1.100 -u app -p
# real  28.45s  <-- 大部分耗在 DNS 反解

# 伺服器端抓包
tcpdump -i eth0 port 53
# 可見 MySQL 向 DNS 伺服器查詢 100.1.168.192.in-addr.arpa PTR

解決方案:修改 my.cnf / my.ini

[mysqld]
# 禁用 DNS 反向解析
skip-name-resolve

# 可選:同時禁用主機名快取 (預設 128 筆)
# host_cache_size = 0

重啟 MySQL 服務生效:systemctl restart mysqld 或 service mysql restart。

副作用與應對

驗證生效

# 1. 連線速度測試
time mysql -h 192.168.1.100 -u app -p -e "SELECT 1;"
# real  0.12s  <-- 瞬時完成

# 2. 確認參數生效
mysql -u root -p -e "SHOW VARIABLES LIKE 'skip_name_resolve';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+

進階:針對特定網段保留解析 (MySQL 8.0+)

若內網有完善 DNS,僅外網連線慢,可不開啟 skip-name-resolve,改用:

[mysqld]
# 限制主機名快取大小與 TTL
host_cache_size = 256
# 不解析特定網段 (需 Patch 或 Proxy 實現,原生不支援)

或部署 **ProxySQL** 在應用與 MySQL 之間,ProxySQL 以 IP 連線 MySQL (啟用 skip-name-resolve),應用連線 ProxySQL (可用主機名)。

適用場景總結

  • 內網無 DNS 伺服器 / DNS 不穩定 / PTR 記錄缺失 → **必開 skip-name-resolve**。
  • 雲端資料庫 (RDS/CloudSQL) 通常預設已開啟或強制 IP 連線。
  • Docker 容器間連線:容器 IP 無 PTR,必開。
  • 需保留主機名授權:配合 ProxySQL 或接受 IP 格式授權。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
副作用影響應對
無法在 GRANT/建立使用者時使用主機名CREATE USER 'app'@'appserver.example.com' 失效統一使用 IP 格式:'app'@'192.168.1.%'、'app'@'10.0.0.0/255.255.255.0'
SHOW PROCESSLIST Host 欄顯示 IP失去可讀主機名接受,或應用層自行解析記錄
效能 Schema hosts 表僅有 IP監控儀表板需調整調整儀表板查詢