同一台 MySQL 伺服器,本機 mysql -u root -p 秒連,遠程客戶端 mysql -h 192.168.x.x -u root -p 需等待 5~10 秒才出現密碼提示。Ping、Telnet 3306 均正常,排除網路延遲。
新連線建立時,MySQL 執行:
gethostbyaddr() 反向解析主機名。gethostbyname() 正向解析驗證。mysql.user 表 Host 欄位匹配。若 DNS 伺服器不可達、或無 PTR 記錄、或解析超時,步驟 2~3 會阻塞數秒至數十秒。**開發/測試環境常無法訪問外網 DNS,導致每次連線必須等待解析超時。**
編輯 my.cnf / my.ini,[mysqld] 區段加入:
[mysqld]
skip-name-resolve
重啟 MySQL:systemctl restart mysqld / net restart MySQL57。
| 影響 | 說明 | 應對 |
|---|---|---|
mysql.user Host 欄位不能用主機名 | 只能用 IP、CIDR、% 通配符 | 授權語句改用 IP:GRANT ... TO 'user'@'192.168.1.%' |
| 日誌/審計顯示 IP 而非主機名 | 失去可讀性 | 應用層自行關聯 IP→主機名映射表 |
舊版本 FLUSH HOSTS 清理快取失效 | 快取被禁用 | 無需清理,直接生效 |
[mysqld]
# host_cache_size 預設 128,最大 65536(需重新編譯或 8.0+ 動態調整)
host_cache_size = 1024
適合「內網有可靠 DNS、但連線高併發導致解析爭用」場景。但開發環境無 DNS 時,**只能用 skip-name-resolve**。
# 遠程客戶端測試
time mysql -h 192.168.1.100 -u root -p -e "SELECT 1;"
# 應從 ~5s 降至 <0.1s
一行配置、一重啟、立竿見影。將 skip-name-resolve 列入 MySQL 標準化部署清單,專治「連線慢、查詢快」的疑難雜症。