skip_name_resolve 的作用
MySQL 默认在收到连接时把客户端 IP 反向解析成主机名,再拿去和授权表里的 Host 字段比较。开启 skip_name_resolve 后这一步被跳过,Host 只能按 IP、网段或通配符匹配。收益是认证阶段不再等 DNS,连接建立更快、也不再因为解析抖动而偶发失败;代价是所有主机名形式的账号立刻失效。
基本信息
| 适用平台 | MySQL / MariaDB 服务端 |
|---|---|
| 参数 | skip_name_resolve = ON,写在 my.cnf 的 [mysqld] 段 |
| 变量类型 | 启动参数,不支持 SET GLOBAL 动态打开 |
| 作用 | 跳过客户端 IP 的反向 DNS 查询 |
| 副作用 | Host 为主机名字符串的账号不再匹配 |
| 仍然有效 | localhost、127.0.0.1、网段与通配符写法 |
典型使用场景
- 高并发短连接:DNS 反解会拖慢每一次认证,关掉后连接建立更稳定
- 容器与 Kubernetes 网络没有 PTR 记录,反解超时导致偶发连接卡顿
- 云上客户端 IP 多变,反查经常失败或返回不可用主机名
- 安全合规要求账号只用 IP 或网段授权,不允许主机名匹配
- 排查「连接慢但不报错」的问题时用来验证卡点是否在解析环节
配置与检查
配置与检查
# my.cnf
[mysqld]
skip_name_resolve = ON
# 重启后确认已生效(ON 为 1)
mysql -e "SHOW VARIABLES LIKE 'skip_name_resolve';"
# 找出依赖主机名的账号:host 含字母且不是 localhost
mysql -e "SELECT user, host FROM mysql.user WHERE host RLIKE '[a-zA-Z]' AND host <> 'localhost';"
# 改写为 IP 或网段形式
mysql -e "RENAME USER 'app'@'db01.example.com' TO 'app'@'10.20.0.0/255.255.0.0';"
mysql -e "FLUSH PRIVILEGES;"现象与处理对照
| 现象 | 原因 | 处理 |
|---|---|---|
| 连接建立耗时一秒以上 | 客户端 IP 没有 PTR 记录,解析超时 | 开启 skip_name_resolve 并改用 IP 授权 |
| 切换后大面积 Access denied | 账号 Host 是主机名,开启后不再匹配 | 先 RENAME USER 改成 IP 或网段再切换 |
| 偶发连接失败 | DNS 服务抖动导致反解失败 | 去掉解析依赖,或用本机 hosts 兜底 |
| localhost 账号仍能登录 | 本机 socket 连接不参与反解 | 属预期行为 |
| 审计日志里只有 IP | 解析被跳过,没有主机名可记 | 需要主机名时查资产系统反查 |
开启后 IP 与通配符写法照常可用,例如 '10.20.%' 与 '10.20.0.0/255.255.0.0';只有纯主机名字符串会失效。稳妥顺序是先按上面的查询列出账号并逐一改写,再改配置重启。