在 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 形式授權,**將無法匹配**,導致拒絕連接mysql> SELECT User, Host FROM mysql.user WHERE Host <> 'localhost'; +------+-----------+ | User | Host | +------+-----------+ | root | % | | app | db1 | -- 主機名授權,將失效 | repl | 192.168.1.% | -- IP 段授權,正常 +------+-----------+
-- 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';
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 TO | MASTER_HOST 必須填 IP,不能填主機名 |
| 監控/備份腳本 | 檢查所有腳本連接參數,統一改為 IP |
skip-name-resolve 是性能與穩定性的利器,但**前置條件是權限表純淨化(全 IP 化)**。上線前務必完成:審計權限表 → 修正非 IP Host → 測試全鏈路連接 → 再啟用參數,才能安享其利、避其害。