看到大量unauthenticated user即可确定是dns反向解析卡住,mysql调用gethostbyaddr()反解ip失败或超时,线程卡在login状态;需配置skip-name-resolve=on于[mysqld]段并重启,同时将mysql.user表中非ip/%%的host替换为对应ip或网段。

直接看 SHOW PROCESSLIST 里有没有大量 unauthenticated user,有就基本坐实了——不是网络不通,是 MySQL 卡在 DNS 反查上。
怎么快速确认是 DNS 反向解析卡住的?
别等应用报错或改配置,用三个低成本命令立刻验证:
- 在 MySQL 服务端执行
SHOW PROCESSLIST;,新连接长期卡在Connecting或Checking permissions状态,且Host列显示 IP(如10.0.2.5:52183)而非主机名,就是典型信号 - 执行
SELECT @@skip_name_resolve;,返回0表示反查没关;再查错误日志有没有Can't get hostname for your address或Aborted connection ... user: 'unauthenticated' - 用
strace -p $(pgrep mysqld) -e trace=gethostbyaddr,gethostbyname挂着,复现一次慢连接,看到反复阻塞在gethostbyaddr()就是它
为什么加了 skip-name-resolve = ON 还不生效?
这个参数只对服务端起作用,写错位置、没重启、被覆盖都会白配:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 必须写在
[mysqld]段内,写在[client]或配置文件开头无效 - Ubuntu/Debian 常见坑:
!includedir /etc/mysql/conf.d/会覆盖主配置,先运行mysqld --verbose --help | grep "Default options"确认最终加载路径 -
systemctl reload mysql不生效,必须systemctl restart mysql - Windows 用户注意:要写在
my.ini的[mysqld]段,不是全局段
开了 skip-name-resolve 为什么用户全连不上?
这不是配置失败,是行为变更的必然结果:MySQL 彻底跳过 DNS 解析后,mysql.user 表里的 Host 字段只能字面匹配 IP 或 %,所有域名授权(如 'app'@'web01.example.com')全部失效。
- 典型现象:
Access denied for user 'app'@'192.168.1.100',但SELECT User, Host FROM mysql.user显示的是'app'@'web01.example.com' - 检查问题账号:
SELECT User, Host FROM mysql.user WHERE Host NOT IN ('%', 'localhost', '127.0.0.1', '::1') AND Host NOT REGEXP '^\d+\.\d+\.\d+\.\d+$'; - 修复方式:逐条更新为实际客户端 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 不可持续;此时应评估是否真能关反查,或改用本地
/etc/hosts加速
最常被忽略的一点:客户端连接串里如果用了 hostname(如 host=database-prod),DNS 解析慢的问题其实还在客户端侧,skip-name-resolve 并不解决这个——那是你 DNS client 配置或网络的问题。










