MySQL连接卡在“Connecting to…”阶段大概率是服务端反向DNS解析阻塞,可通过停DNS服务或换IPv6回环快速验证;须在[mysqld]段配置skip-name-resolve=ON并重启,且必须将mysql.user表中域名授权改为IP或%才能正常连接。

MySQL连接卡在“Connecting to…”阶段,大概率是服务端在做反向 DNS 解析(gethostbyaddr())被卡住,不是网络不通,也不是密码错——关掉 skip_name_resolve 就能解决,但必须配对改权限,否则连不上。
怎么确认真是 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 的反查阻塞 - 登录 MySQL 后执行
SELECT @@skip_name_resolve;,返回0表示未跳过解析 - 看
SHOW PROCESSLIST;的Host列:如果长期显示 IP(如10.0.2.5:52183)但状态卡在Connecting,就是它
如何正确启用 skip_name_resolve?
这个参数只在服务端生效,且只认 [mysqld] 段,写错位置或不重启等于没做:
- 编辑配置文件(Linux 常见路径:
/etc/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf;Windows 是安装目录下的my.ini) - 在
[mysqld]段下添加: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 为什么反而连不上?
因为 MySQL 彻底跳过 DNS 解析后,user@host 中的 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就拒绝——这是权限粒度变化的明确信号 - 修复步骤:
UPDATE mysql.user SET Host = '192.168.1.100' WHERE User = 'app' AND Host = 'web01.example.com'; FLUSH PRIVILEGES; - 批量检查问题账号:
SELECT User, Host FROM mysql.user WHERE Host NOT IN ('%', 'localhost', '127.0.0.1', '::1'); - Kubernetes 等动态 IP 场景慎用:Pod IP 频繁变化,硬写 IP 不可持续,应评估是否真能关反查
客户端用域名连接慢,和 skip_name_resolve 无关
如果你的应用连接串里是 host=database-prod,那慢的是客户端本地 DNS 正向解析(getaddrinfo()),不是服务端反查:
- 测耗时:
time host database-prod或time nslookup database-prod - 临时绕过:
echo "10.0.2.5 database-prod" >> /etc/hosts(仅限测试) - 云环境常见问题:客户端 DNS 请求路径异常(如走公网 DNS 而非内网 CoreDNS),需检查
/etc/resolv.conf - SSL/TLS 握手失败也会“假装”是 DNS 问题:用
mysql -h 127.0.0.1 -u root -p --ssl-mode=DISABLED测试,若立刻连上,问题在 SSL 配置
真正要动的是服务端配置和权限表,不是改客户端命令或 hosts;而最常被忽略的,是改完 skip-name-resolve 后忘记更新 mysql.user 表里的 Host 字段——连不上不是配置没生效,是权限直接丢了。


















