mysql 8.0 连接卡顿的根因是服务端默认 skip_name_resolve = off,导致每次 tcp 连接(含 127.0.0.1)均强制执行 dns 反向解析 gethostbyaddr(),若 dns 不可达或无 ptr 记录,将阻塞数秒至 30 秒;解决方法是在 [mysqld] 段配置 skip-name-resolve 并重启,同时授权用户 host 必须改为 ip 或 %。

MySQL 8.0 连接卡顿的根因是 skip_name_resolve = OFF
本地或远程用 127.0.0.1 或任意 IP 连 MySQL 8.0,首次连接慢几秒甚至超时,不是网络问题、不是 Navicat 或驱动问题,而是服务端默认开启 DNS 反向解析:每次 TCP 连接建立后,MySQL 立即调用 gethostbyaddr() 查客户端 IP 对应的主机名。若系统没配好 /etc/hosts、DNS 不可达、或内网无 PTR 记录,就会卡住等超时(Linux 默认 30 秒,Windows 常卡 2–5 秒)。
验证方式很简单:time mysql -h 127.0.0.1 -u root -p 耗时明显长于 mysql -S /var/run/mysqld/mysqld.sock -u root -p(Unix socket),就基本锁定这个问题。
必须在 [mysqld] 段加 skip-name-resolve 并重启
这个配置只在 [mysqld] 节下生效,写在 [client]、[mysql] 或文件开头都无效。不同系统路径如下:
- Linux 常见路径:
/etc/my.cnf、/etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf - Windows 常见路径:MySQL 安装目录下的
my.ini(如D:\phpEnv\phpEnv\MySQL\my.ini)
编辑配置文件,在 [mysqld] 段末尾添加一行:
skip-name-resolve
然后必须重启服务才生效:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- Linux:
sudo systemctl restart mysql(注意不是mysqld) - Windows:用服务管理器重启
mysql服务,或命令行执行net stop mysql && net start mysql
重启后登录 MySQL,运行:SHOW VARIABLES LIKE 'skip_name_resolve';
返回值为 ON 才算成功。
开了 skip-name-resolve 后连不上?授权 host 写错了
启用 skip-name-resolve 后,MySQL 彻底跳过所有 DNS 解析,host 字段只认纯 IP(如 '127.0.0.1')或通配符 '%',不再识别 'localhost' 的别名、也不认任何域名(如 'webserver.local')。
典型错误场景:
- 原授权是
GRANT ALL ON *.* TO 'root'@'localhost'→ 改用'root'@'127.0.0.1'或'root'@'%' - 远程用户写成
'app'@'app-server.local'→ 必须改为'app'@'192.168.1.100'或'app'@'%' - 创建用户时用了
CREATE USER 'dev'@'localhost'→ 应改用CREATE USER 'dev'@'127.0.0.1'(尤其在 Windows 或 Docker 中,localhost会走 socket,而127.0.0.1强制走 TCP)
改完授权后,记得执行 FLUSH PRIVILEGES;。
为什么不能只改 hosts 或加 --host 参数来绕过?
这是服务端行为,不是客户端能控制的。无论你客户端加不加 --host=127.0.0.1、也无论你在 /etc/hosts 里加多少条映射,只要服务端 skip_name_resolve = OFF,它就一定会发起反查。很多用户反复检查客户端配置却忽略服务端配置,就是卡在这里。
另外注意:Docker 环境下,如果 MySQL 容器启动时没挂载正确配置,或者用 docker run -e 动态传参覆盖了 my.cnf,skip-name-resolve 也可能未生效——必须确认容器内实际加载的配置文件中 [mysqld] 段确实包含该选项,并且容器是 restart 而非仅 exec 进去改文件。










