萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 遠程連接緩慢?一鍵開啟 skip-name-resolve 徹底解決 DNS 解析延遲

開發環境 MySQL 遠程連接極慢,本地連接卻極快,網路 Ping 正常。根因是 MySQL 預設對連接 IP 執行反向 DNS 解析,內網無外網 DNS 導致超時等待。啟用 skip-name-resolve 參數即可徹底解決。

問題現象

  • 遠程連接 MySQL 需等待 10-30 秒才回應
  • 本機 mysql -h localhost 秒連
  • ping、traceroute 網路完全正常
  • 開發機器無外網訪問權限,DNS 解析必失敗

根因分析

MySQL 連接處理流程:

  1. 新執行緒接收連接
  2. 檢查主機名快取 (host_cache)
  3. 未命中 → 呼叫 gethostbyaddr_r() 反向解析 IP → 主機名
  4. 再呼叫 gethostbyname_r() 正向解析驗證
  5. 若 OS 不支援執行緒安全版本,加全域互斥鎖串行執行,進一步惡化並發

無外網 DNS 時,第 3 步超時等待 (預設 10-30 秒),導致連接建立極慢。

解決方案

修改配置文件:

[mysqld]
skip-name-resolve
  • Linux:/etc/my.cnf 或 /etc/mysql/my.cnf
  • Windows:MySQL 安裝目錄下 my.ini

務必置於 [mysqld] 區塊下,存檔後重啟 MySQL 服務。

副作用與應對

啟用後,權限表 mysql.user 的 Host 欄位只能使用 IP 地址,不能使用主機名/域名。

遷移步驟:

  1. 備份現有權限:SHOW GRANTS FOR 'user'@'hostname';
  2. 建立對應 IP 權限:CREATE USER 'user'@'192.168.1.%' IDENTIFIED BY 'pass';
  3. 授權:GRANT ... TO 'user'@'192.168.1.%';
  4. 驗證無誤後刪除舊主機名帳號

替代方案 (不建議)

  • skip-host-cache:禁用主機名快取,每次連接仍解析,不解決根本問題。
  • 增大 HOST_CACHE_SIZE (需重編譯):治標不治本。
  • 配置本地 /etc/hosts 映射:維護成本高,不適用動態 IP 環境。

官方文檔引用

「You can disable DNS host lookup by starting mysqld with --skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables.」

適用於:內網隔離環境、容器化部署、無外網 DNS 的雲主機、高並發連接場景。配置生效後連接建立時間從秒級降至毫秒級。

copyright © 萬盛學電腦網 all rights reserved