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

MySQL 啟用 skip-name-resolve 後無法連接?根因與修復全流程

     編輯:MySQL 資料庫相關知識

現象:加參數後連不上了

在 my.cnf [mysqld] 區塊添加 skip-name-resolve 以跳過 DNS 反解析、提升連接速度,重啟後卻發現遠程客戶端全部連接失效,報錯 Access denied 或 Host not allowed。

一、核心原理

  • skip-name-resolve=ON:MySQL **不再進行 IP → Hostname 反解析**,權限表 mysql.user 中的 Host 列**必須使用 IP 地址或通配符 %**
  • 若權限表存在 Host='db1'、Host='localhost' 等非 IP 形式授權,**將無法匹配**,導致拒絕連接

二、排查與修復步驟

步驟 1:檢查當前權限表中的 Host 值

mysql> SELECT User, Host FROM mysql.user WHERE Host <> 'localhost';
+------+-----------+
| User | Host      |
+------+-----------+
| root | %         |
| app  | db1       |  -- 主機名授權,將失效
| repl | 192.168.1.% |  -- IP 段授權,正常
+------+-----------+

步驟 2:修正非 IP 形式的 Host 授權

-- 1. 將 localhost 改為 127.0.0.1(本地連接用)
UPDATE mysql.user SET Host='127.0.0.1' WHERE User='root' AND Host='localhost';

-- 2. 刪除或修正主機名授權(如 db1, db2)
DELETE FROM mysql.user WHERE Host NOT IN ('%', '127.0.0.1', '192.168.1.%', '10.%');
-- 或改為 IP 段
UPDATE mysql.user SET Host='192.168.1.%' WHERE Host='db1';

步驟 3:刷新權限並驗證

FLUSH PRIVILEGES;
-- 測試連接
mysql -h 127.0.0.1 -u root -p
mysql -h 192.168.1.100 -u app -p

三、關鍵注意點

場景處理方式
本地連接用 localhost必須改用 127.0.0.1 或 --protocol=tcp 強制 TCP 連接(Unix Socket 不受影響)
應用配置寫死 hostname修改應用端連接字串為 IP,或在 /etc/hosts 映射(不推薦,違背 skip-name-resolve 初衷)
從庫 CHANGE MASTER TOMASTER_HOST 必須填 IP,不能填主機名
監控/備份腳本檢查所有腳本連接參數,統一改為 IP

四、為什麼推薦開啟 skip-name-resolve?

  • 消除 DNS 解析延遲(特別是 DNS 故障/慢導致連接超時)
  • 避免「主機名變更/解析異常」引發的權限匹配失效
  • 權限管理更直觀:只認 IP,不認名字

五、總結

skip-name-resolve 是性能與穩定性的利器,但**前置條件是權限表純淨化(全 IP 化)**。上線前務必完成:審計權限表 → 修正非 IP Host → 測試全鏈路連接 → 再啟用參數,才能安享其利、避其害。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved