現象:區域網路/遠程客戶端連線 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。
副作用與應對
| 副作用 | 影響 | 應對 |
| 無法在 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 | 監控儀表板需調整 | 調整儀表板查詢 |
驗證生效
# 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 格式授權。
- 上一篇文章: MySQL 資料遷移至 SQLite 工具:CYQ.DBImport 使用指南
- 下一篇文章: SQL Server DBA 核心職責全景圖:12 大任務領域與關鍵指標
Copyright ©
程式碼之家 All Rights Reserved