直接关掉skip_name_resolve可根治dns反查导致的连接慢,但必须同步将mysql.user表中域名授权(如'user'@'host.example.com')更新为ip或'%'并执行flush privileges,否则用户会报access denied;验证是否为dns反查卡住,可用strace捕获gethostbyaddr调用或停dns服务后测试连接延迟。

直接关掉 skip_name_resolve 是最有效的根治手段,但必须同步修复权限表,否则用户会集体报 Access denied。
怎么确认真是 DNS 反查卡住的?
别靠日志猜,用两个命令快速定位:
- 临时停本机 DNS 服务:
sudo systemctl stop systemd-resolved,再执行mysql -h 127.0.0.1 -u root -p;如果秒进,基本锁定是服务端反查阻塞 - 换 IPv6 回环测试:
mysql -h ::1 -u root -p;若 IPv4 卡顿、IPv6 立即响应,说明是 IPv4 的gethostbyaddr()调用在等 DNS - 登录后执行
SHOW PROCESSLIST;,看新连接的Host列是否长期显示 IP(如10.0.2.5:52183)但状态卡在Connecting to master或Checking host - 更直接:用
strace -p $(pgrep mysqld) -e trace=gethostbyaddr捕获系统调用,反复失败的gethostbyaddr就是瓶颈
如何正确启用 skip_name_resolve?
这个参数只在服务端生效,写错位置或不重启等于没做:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 必须加在配置文件的
[mysqld]段下,常见路径:/etc/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)、Windows 下是my.ini - 写法严格:
skip-name-resolve = ON(注意是短横线,不是下划线;大小写不敏感,但值推荐大写) - 必须重启:
sudo systemctl restart mysql(reload不生效) - 验证是否生效:
mysql -e "SHOW VARIABLES LIKE 'skip_name_resolve';"返回ON才算成功 - Ubuntu/Debian 用户注意:
!includedir /etc/mysql/conf.d/可能覆盖主配置,用mysqld --verbose --help | grep "Default options"确认最终加载路径
开了 skip_name_resolve 为什么连不上?
这不是 bug,是行为变更的必然结果:MySQL 彻底跳过反查后,mysql.user 表里的 host 字段只能匹配原始 IP 或 %,所有域名授权全部失效。
- 典型报错:
Access denied for user 'app'@'192.168.1.100',但SELECT User, Host FROM mysql.user显示的是'app'@'web01.example.com' - 本地
localhost能连、换成127.0.0.1就拒绝——这是权限粒度变化的明确信号 - 批量检查问题账号:
SELECT User, Host FROM mysql.user WHERE Host NOT IN ('%', 'localhost', '127.0.0.1', '::1'); - 修复方式:逐条更新为对应 IP,例如
UPDATE mysql.user SET Host = '10.0.2.5' WHERE User = 'app' AND Host = 'web01.example.com'; FLUSH PRIVILEGES; - Kubernetes 等动态 IP 场景慎用:Pod IP 频繁变化,硬写 IP 不可持续;若必须保留域名白名单,就别开
skip_name_resolve,改用/etc/hosts映射或优化 DNS 配置
客户端用域名连接慢,skip_name_resolve 无效
如果应用连接串里是 host=database-prod,那慢的是客户端本地 DNS 解析(getaddrinfo()),不是服务端反查——skip_name_resolve 对它完全没影响。
- 此时应检查客户端的
/etc/resolv.conf、DNS 缓存、或网络策略 - 临时绕过:强制用 IP 连接,比如把
host=database-prod改成host=10.20.30.40 - SSL/TLS 握手失败也会伪装成“连接慢”,可用
mysql --ssl-mode=DISABLED测试排除
真正麻烦的不是关掉解析,而是权限表里混着域名和 IP 的授权记录——漏改一条,线上服务就可能中断。动手前务必先备份 mysql.user 表。










