現象
- 本地連線正常(< 1ms)。
- 區域網路遠程連線延遲 4~20 秒 才出現密碼提示或完成握手。
- Toad for MySQL、Workbench、命令列皆重現。
根因:DNS 反向解析
MySQL 預設啟用 skip-name-resolve=OFF,收到 TCP 連線時會:
- 取得客戶端 IP。
- 發起 PTR 反向查詢解析主機名。
- 若 DNS 伺服器無回應/超時/無 PTR 記錄,MySQL 阻塞等待直到逾時(預設 10~20 秒)。
- 解析成功則用主機名匹配
mysql.user.Host;失敗則用 IP 匹配。
解決方案:關閉反向解析
編輯配置檔:
[mysqld]
skip-name-resolve=1
# 或
skip-name-resolve
- Linux:
/etc/my.cnf 或 /etc/mysql/my.cnf
- Windows:
my.ini(通常在安裝目錄或 C:\ProgramData\MySQL\MySQL Server 8.0\)
重啟服務:systemctl restart mysqld / net stop mysql && net start mysql。
副作用與應對
| 影響 | 說明 | 應對 |
| 無法在 GRANT 使用主機名 | GRANT ... TO 'user'@'hostname' 失效 | 一律用 IP 或 %,現代雲原生環境 IP 固定或用 Service Discovery |
| SHOW PROCESSLIST Host 欄顯示 IP | 不再顯示主機名 | 習慣即可,IP 更精確 |
| 日誌/審計記錄 IP | 同上 | 無負面影響 |
進階:保留主機名解析但加速
- 本地 /etc/hosts: 將常用客戶端 IP/主機名寫入,繞過 DNS。
- nscd/sssd 快取: 啟用 Name Service Cache Daemon。
- DNS 伺服器優化: 確保 PTR 區域存在、TTL 合理、權威 DNS 回應快。
驗證生效
mysql> SHOW VARIABLES LIKE 'skip_name_resolve';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| skip_name_resolve | ON |
+-------------------+-------+
# 連線測試
time mysql -h db_server -u user -p -e "SELECT 1;"
# 應在 100ms 內返回
總結
skip-name-resolve=1 是解決 MySQL 遠程連線慢的「銀彈」。除非極少數舊系統強依賴主機名授權,否則生產環境建議預設開啟。配合防火牆白名單、SSL、強密碼,安全性不減反增。
- 上一篇文章: mysqldump 導出表結構與資料完整指南:參數詳解、條件導出、壓縮與自動化
- 下一篇文章: MySQL 效能優化八大實戰法則:欄位設計、JOIN、UNION、事務、鎖表、外鍵、索引、SQL 重寫
Copyright ©
程式碼之家 All Rights Reserved