mysqld 接受後創建新線程處理。gethostbyaddr_r() / gethostbyname_r()(可重入版本),無全局鎖爭用。mutex → 調用 gethostbyaddr() / gethostbyname() → 解鎖。此期間其他線程無法解析新主機名,嚴重影響併發。| 參數 | 作用 | 建議值 |
|---|---|---|
skip-name-resolve | 完全禁用 DNS 反向解析,授權表只能用 IP | 生產環境 強烈建議開啟 |
skip-host-cache | 禁用主機名緩存,每次連接必做 DNS 查詢 | 排查 DNS 故障時臨時開啟 |
host_cache_size | 緩存條目上限(默認 128,5.6+ 可動態調整) | 高併發建議 512~2048 |
skip-networking | 禁用 TCP/IP,僅允許 Unix Socket 本地連接 | 極致安全/單機場景 |
[mysqld]
skip-name-resolve
mysql.user 的 Host 列必須填 IP 或 %,不再支持主機名。[mysqld]
host_cache_size=1024
適用於「無法開啟 skip-name-resolve」(如老應用依賴主機名授權)且連接來源 IP 種類較多的場景。
FLUSH HOSTS;
-- 或
mysqladmin flush-hosts
場景:DNS 記錄變更、客戶端 IP 漂移導致緩存污染、Host 'xxx' is blocked because of many connection errors 報錯。
show variables like 'host_cache_size'; 確認生效值。show status like 'Aborted_connects'; 快速增長通常意味著 DNS 解析超時或認證失敗。performance_schema.host_cache (5.7+) 可直接查看緩存條目、解析耗時、錯誤計數。/etc/resolv.conf nameserver 可達性、/etc/nsswitch.conf hosts 順序(files dns 優先本地 hosts 文件)。MySQL DNS 解析是「隱形性能殺手」。生產環境首選 skip-name-resolve + IP 授權;若業務強依賴主機名,則調大 host_cache_size 並確保底層 DNS 服務高可用、低延遲。