開啟 skip-name-resolve 後,客戶端登錄加速,但本機 root 維護操作(創建觸發器、存儲過程等)報錯 Access denied。重啟服務後 server_id 異常恢復,排查發現多份 my.cnf 干擾。
| 場景 | 未開啟 skip-name-resolve | 開啟 skip-name-resolve |
|---|---|---|
| 遠程連接 (192.168.0.2 → 192.168.0.1) | DNS 反解 IP → 主機名 → 匹配 'user'@'hostname' | 直接匹配 'user'@'192.168.0.2'(跳過 DNS) |
| 本機連接 (localhost) | 匹配 'user'@'localhost' | 解析為 'user'@'127.0.0.1' ⚠️ |
| 本機連接 (127.0.0.1) | 匹配 'user'@'127.0.0.1' | 匹配 'user'@'127.0.0.1' |
'root'@'localhost' 超級賬號skip-name-resolve 後,本機 localhost 連接被解析為 'root'@'127.0.0.1''root'@'127.0.0.1' 不存在或權限不足(默認屬於 '%' 匿名賬號體系)CREATE TRIGGER、SUPER 權限等)失敗-- 以現有 root 登錄(需臨時關閉 skip-name-resolve 或用 127.0.0.1 連接)
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
優點:保持 skip-name-resolve 性能優勢,權限模型清晰。
注意:必須設置強密碼,避免弱口令風險。
my.cnf 中的 skip-name-resolvesystemctl restart mysqld適用:低頻維護、極高安全要求環境。
/etc/hosts 添加:127.0.0.1 localhost(確保 localhost 解析為 127.0.0.1,而非 IPv6 ::1)
局限:無法解決 skip-name-resolve 導致的『localhost → 127.0.0.1』重映射問題,本質上仍需方案一配合。
現象:修改 /etc/my.cnf 後重啟,server_id 仍為舊值。
排查命令:
find / -name "my.cnf" 2>/dev/null
# 輸出示例:
/etc/my.cnf
/usr/local/mysql/my.cnf ← 真正生效的配置文件!
/root/.my.cnf
MySQL 讀取優先級:
/etc/my.cnf → /etc/mysql/my.cnf → DATADIR/my.cnf → ~/.my.cnf(後讀取者覆蓋前者)
教訓:永遠用 mysql --help | grep -A1 'Default options' 確認實際讀取順序,勿憑直覺修改單一路徑。
'user'@'localhost' 和 'user'@'127.0.0.1',權限保持一致my.cnf,統一管理SELECT USER(), CURRENT_USER(); 確認實際匹配賬號skip-name-resolve 狀態及對應賬號策略skip-name-resolve 是把雙刃劍:換取連接速度,代價是破壞『localhost』語義。生產環境建議默認開啟,但必須同步完善 127.0.0.1 賬號體系,並建立「配置文件唯一來源」原則。切記:權限問題 90% 是賬號宿主不匹配,而非密碼錯誤。