[Warning] IP address '192.168.1.10' could not be resolved: Name or service not known
SHOW PROCESSLIST 大量: | 592 | unauthenticated user | 192.168.1.10:35320 | NULL | Connect | | login | NULL |
[mysqld] skip-name-resolve
在 my.cnf [mysqld] 區段加入上述參數並重啟 MySQL,即可禁用 DNS 反解析,消除警告與連線延遲。
host_cache 是否已有 IP→Hostname 映射。gethostbyaddr(IP) → Hostnamegethostbyname(Hostname) → IPgethostbyaddr_r / gethostbyname_r → 線程安全,並發解析。LOCK_host_cache,同一時間僅能解析一個 IP,嚴重阻塞高併發連線。host_cache(預設 128 條),後續連線直接命中。| 功能 | 啟用前 | 啟用後 |
|---|---|---|
| 權限表 Host 欄 | 支援主機名、IP、通配符 | 僅支援 IP 與 % |
| 連線建立延遲 | 可能阻塞等待 DNS | 無 DNS 開銷,極快 |
| host_cache | 正常運作 | 仍存在,但僅存 IP |
| flush hosts | 清理快取 | 同樣有效 |
# /etc/hosts 內容 192.168.1.1 hostname_online 192.168.1.1 h_tt_1
GRANT USAGE ON *.* TO root@'h_tt_%' IDENTIFIED BY 'root'; FLUSH HOSTS;
連線測試:
mysql -h 192.168.1.1 -uroot -proot # ERROR 1045: Access denied for user 'root'@'hostname_online'
結論: MySQL 解析 /etc/hosts 時,以 IP 為鍵值,僅採用第一條匹配記錄,後續同 IP 的其他主機名被忽略。此行為在官方文件「How MySQL Uses DNS」中有明確說明。
skip-name-resolve,權限表統一用 IP/%。/etc/hosts,並確保每個 IP 僅映射一個主機名(或接受首條優先規則)。--skip-host-cache 禁用快取 / FLUSH HOSTS 手動清理 / 增大 HOST_CACHE_SIZE(需重編譯)。最佳實務: 現代雲原生/容器化部署中,服務發現通常由 Sidecar/Service Mesh 處理,資料庫權限建議直接使用 CIDR 區段(如
10.0.0.0/8)或%搭配強認證(SSL/TLS + 強密碼/憑證),徹底繞開 DNS 解析陷阱。