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

MySQL 遠程連線慢?關閉 DNS 反向解析(skip-name-resolve)立竿見影

     編輯:MySQL 資料庫相關知識

現象

  • 本地連線正常(< 1ms)。
  • 區域網路遠程連線延遲 4~20 秒 才出現密碼提示或完成握手。
  • Toad for MySQL、Workbench、命令列皆重現。

根因:DNS 反向解析

MySQL 預設啟用 skip-name-resolve=OFF,收到 TCP 連線時會:

  1. 取得客戶端 IP。
  2. 發起 PTR 反向查詢解析主機名。
  3. 若 DNS 伺服器無回應/超時/無 PTR 記錄,MySQL 阻塞等待直到逾時(預設 10~20 秒)。
  4. 解析成功則用主機名匹配 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。

副作用與應對

進階:保留主機名解析但加速

  • 本地 /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、強密碼,安全性不減反增。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
影響說明應對
無法在 GRANT 使用主機名GRANT ... TO 'user'@'hostname' 失效一律用 IP 或 %,現代雲原生環境 IP 固定或用 Service Discovery
SHOW PROCESSLIST Host 欄顯示 IP不再顯示主機名習慣即可,IP 更精確
日誌/審計記錄 IP同上無負面影響