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

MySQL skip_name_resolve 參數深度總結:原理、適用場景與權衡取捨

     編輯:MySQL 資料庫相關知識

參數作用

skip_name_resolve=ON 禁用 MySQL 服務端對客戶端 IP 的 DNS 反向解析(含主機名解析)。

Host Cache 機制原理(不開啟 skip_name_resolve 時)

MySQL 在內存維護 Host Cache,記錄:IP、Hostname、錯誤計數、驗證標誌。用於:

  1. 緩存 IP↔Hostname 映射,避免重複 DNS 查詢
  2. 記錄連接失敗次數,超過 max_connect_errors 封禁 IP

映射建立流程

  1. 新連接進入 → Host Cache 建立記錄:IP=客戶端IP, Host=NULL, HOST_VALIDATED=FALSE
  2. 檢測 HOST_VALIDATED=FALSE → 嘗試 DNS 解析 IP→Hostname
  3. 解析成功 → 反向驗證 Hostname→IP 是否一致
  4. 一致 → 更新 Host=主機名, HOST_VALIDATED=TRUE;不一致/失敗 → 標記永久/臨時失敗

Host Cache 優缺點權衡

優點缺點
主機名授權一次生效,IP 變動無需改權限新連接首次需 DNS 解析,延遲敏感場景有影響
失敗計數防暴力破解(配合 max_connect_errors)大量客戶端 IP 會擠佔 cache(LRU 淘汰),導致重複解析

max_connect_errors 實測封禁機制


SET GLOBAL max_connect_errors = 2;
-- 模擬中斷連接
telnet host 3306  # 連上立即斷開,重複 2 次
-- 再次正常連接
mysql -h host -uroot -p
ERROR 1129 (HY000): Host 'x.x.x.x' is blocked because of many connection errors

解封方式:FLUSH HOSTS; / mysqladmin flush-hosts / TRUNCATE performance_schema.host_cache; / 等待 LRU 淘汰。

開啟 skip_name_resolve 後的影響

  1. mysql.user 表中基於主機名的賬號失效: root@'mysql-slave1' 無法登錄
  2. 錯誤日誌警告:[Warning] 'user' entry 'root@mysql-slave1' ignored in --skip-name-resolve mode.
  3. 連接顯示:root@192.168.x.x(IP 而非主機名)
  4. 需將所有賬號改為 IP 或 % 授權

查看當前連接類型


mysql> \s
Connection: 192.168.1.100 via TCP/IP  -- 或 Localhost via UNIX socket

禁用 Host Cache 替代方案


SET GLOBAL host_cache_size = 0;  -- 動態生效,無需重啟

完全禁用 TCP/IP


[mysqld]
skip-networking  # 僅允許本地 Socket 連接

總結建議

  1. 內網穩定、客戶端固定、DNS 可靠: 可不開啟,享受主機名授權便利
  2. 公網暴露、DNS 不穩、極致低延遲: 開啟 skip_name_resolve,改用 IP/% 授權
  3. 折中: 保持關閉,但調大 host_cache_size、監控 DNS 延遲
  4. 關鍵: 任何變更前,務必梳理現有賬號授權模式,避免誤封業務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved