首页/数据/数据库速查/skip_name_resolve 与主机名解析

skip_name_resolve 与主机名解析

开启 skip_name_resolve 后账号主机部分只能用 IP/通配,不再做 DNS 反解:登录更快且避免解析故障导致连不上。

数据库速查数据更新于 2026-10-13

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';只有纯主机名字符串会失效。稳妥顺序是先按上面的查询列出账号并逐一改写,再改配置重启。

易错点

  • 先开参数后改账号:所有主机名形式的账号立即 Access denied,正确顺序是先改写授权再重启
  • 以为 SET GLOBAL 能立刻生效:该参数只在启动时读取,改动必须写进配置文件并重启实例
  • 图省事把主机名账号统一改成通配符:等于放开任意来源,应按业务网段收窄范围
  • 依赖主机名做审计追溯:开启后日志里只剩 IP,需另接资产或 CMDB 系统反查

数据来源与参考

  • MySQL 8.0 Reference Manual: skip_name_resolve

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌