首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

禁用 MySQL DNS 反向解析:解決遠程連接極慢 (4-20 秒) 的一鍵方案

     編輯:MySQL 資料庫相關知識

現象:本地連接毫秒級,遠程連接需等待 4-20 秒才返回「密碼提示」或完成握手。根因:MySQL 默認開啟 DNS 反向解析,嘗試將客戶端 IP 解析為主機名,再正向解析驗證。網絡環境無 DNS/解析慢/防火墻攔截,直接導致連接建立階段長時間阻塞。

一、 核心配置

[mysqld]
skip-name-resolve

放入 my.cnf (Linux) 或 my.ini (Windows) 的 [mysqld] 區塊,重啟 mysqld 生效。

二、 原理深度解析

  1. 新連接到達 → 線程調用 gethostbyaddr_r() 反向解析 IP → hostname。
  2. 再調用 gethostbyname_r() 正向解析 hostname → IP,比對一致性。
  3. 若 OS 不支持線程安全版,加全局互斥鎖 → 串行化解析 → 併發連接排隊。
  4. 解析超時 (默認無超時/依賴 OS) → 連接線程長時間阻塞。

skip-name-resolve 直接跳過第 1、2 步,基於 IP 直接匹配權限表,消除 DNS 依賴。

三、 副作用與應對 (必讀)

四、 完整變更清單

  1. 備份配置:cp /etc/my.cnf /etc/my.cnf.bak
  2. 編輯 [mysqld] 區塊添加 skip-name-resolve。
  3. 檢查權限表:SELECT User, Host FROM mysql.user; 確認無主機名條目,或提前轉換。
  4. 應用端配置:JDBC/ODBC/PDO 連接串 Host 改為 IP。
  5. 低峰期重啟:systemctl restart mysqld / net stop mysql && net start mysql。
  6. 驗證:遠程 time mysql -h IP -u user -p 觀察提示密碼延遲 < 100ms。

五、 進階替代方案 (不想改權限表)

  • 增大 Host Cache: SET GLOBAL host_cache_size = 1024; (需重啟持久化),減少重複解析。
  • 禁用 Host Cache: skip-host-cache,配合 FLUSH HOSTS 手動清理。
  • 修復 DNS 基礎設施: 內網 DNS 服務器、/etc/hosts 靜態映射、防火墻放行 53 端口 —— 從根源解決,保留主機名權限便利性。

六、 Windows 特殊說明

Windows 下 gethostbyaddr 實現差,反向解析極慢。生產環境強制建議加上 skip-name-resolve。若必須用主機名權限,請在應用服務器 C:\Windows\System32\drivers\etc\hosts 預置映射。

七、 總結

skip-name-resolve 是「高延遲、低維護成本」與「零 DNS 依賴、需改權限表」的經典權衡。對於微服務/容器化/雲原生環境 (IP 固定、服務發現基於 IP),收益遠大於代價,建議作為 MySQL 標準化初始化參數強制開啟。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
副作用影響範圍解決方案
權限表 Host 列不再支持主機名GRANT ... TO 'user'@'hostname' 失效全量改為 IP/通配符:'user'@'192.168.1.%'、'user'@'%'
localhost 連接失效Unix Socket 連接不受影響;TCP 連接 -h localhost 會解析為 127.0.0.1 但權限表無 localhost應用配置改為 127.0.0.1;或保留 localhost 權限並接受 TCP 連接走 DNS (不推薦)
SHOW PROCESSLIST Host 列顯示 IP運維習慣適應無需修復,IP 更利於追蹤