skip_name_resolve 是 MySQL 性能調優與安全加固的經典開關。本文從 Host Cache 內部機制、DNS 解析流程、max_connect_errors 防暴力破解、參數開啟後的授權模型變化、host_cache_size 動態控制五個維度,構建完整認知體系。
MySQL 為非本地 TCP 連接維護內存級 Host Cache,包含三欄:
可通過 performance_schema.host_cache 表觀測:
SELECT IP, HOST, HOST_VALIDATED, SUM_CONNECT_ERRORS, COUNT_AUTHENTICATION_ERRORS
FROM performance_schema.host_cache;
HOST=NULL, HOST_VALIDATED=FALSEHOST_VALIDATED=FALSE → 執行正向解析 IP → hostnamehostname → IP_listHOST=hostname, HOST_VALIDATED=TRUEHOST=NULL, HOST_VALIDATED=TRUE,後續不再解析HOST_VALIDATED=FALSE,下次連接重試| 維度 | 優點 | 缺點 |
|---|---|---|
| 性能 | 緩存命中避免重複 DNS 查詢 | 首次連接阻塞於 DNS;大量客戶端導致 LRU 淘汰頻繁重解析 |
| 運維 | 基於主機名授權,IP 變更無需改權限 | DNS 劫持/污染導致授權異常 |
| 安全 | SUM_CONNECT_ERRORS 配合 max_connect_errors 防暴力破解 | 緩存被惡意填滿導致合法客戶端被擠出 |
-- 動態調整閾值(默認 100,測試設為 2)
SET GLOBAL max_connect_errors = 2;
-- 模擬中斷連接(telnet 建連後直接斷開)
telnet 192.168.1.100 3306
# 重複 2 次後,正常登入也會報錯:
# ERROR 1129 (HY000): Host '192.168.1.101' is blocked because of many connection errors
-- 解封三種方式
mysqladmin flush-hosts; -- 推薦,清空 Host Cache
TRUNCATE TABLE performance_schema.host_cache; -- 5.6.6+ 支持
-- 或等待 LRU 自然淘汰
mysql.user 表中基於主機名的賬號失效(如 'root'@'hostname')[Warning] 'user' entry 'root@hostname' ignored in --skip-name-resolve mode.CURRENT_USER() 顯示為 'root'@'192.168.1.101'(IP 形式)'user'@'IP'、'user'@'127.0.0.1'、'user'@'::1'、'user'@'localhost'(Unix Socket 不受影響)
-- 完全禁用 Host Cache(5.6.8+)
SET GLOBAL host_cache_size = 0;
-- 禁用 TCP/IP 連接(僅允許 Unix Socket)
-- 需在啟動參數添加 skip-networking
| 場景 | 建議 | 理由 |
|---|---|---|
| 內網穩定、客戶端固定 IP、高併發短連接 | 開啟 skip_name_resolve | 消除 DNS 開銷,IP 授權簡單可控 |
| 雲環境、客戶端 IP 動態、依賴安全組/主機名授權 | 保持默認(關閉) | 主機名授權解耦 IP 變更,DNS 開銷可接受 |
| 遭受連接風暴攻擊 | 開啟 + 降低 max_connect_errors + 監控 host_cache | 快速封禁惡意 IP,緩解連接佔用 |
| 排查連接異常 | 查 performance_schema.host_cache + \s 確認協議 | 直觀定位 DNS 失敗、封禁狀態、Socket/TCP 協議 |
理解 Host Cache 全鏈路,才能在性能、運維、安全三角中做出精準決策。建議將 host_cache_size、max_connect_errors、skip_name_resolve 納入巡檢清單,定期審視狀態變量與錯誤日誌。