加 skip-name-resolve 可解决首次连接卡顿,但必须置于[mysqld]段并重启生效,且授权 host 必须改为 ip 或 %,否则因权限不匹配导致连接失败或部分延迟。

直接加 skip-name-resolve 就能解决首次连接卡顿问题,但必须配对调整权限写法和超时设置,否则会连不上或空闲断连。
为什么加了 skip-name-resolve 还是慢?
常见错误现象是:改完配置、重启 MySQL,Navicat 或 PHP 仍要等 5–10 秒才连上——大概率是因为没生效或配置位置错了。
-
skip-name-resolve必须放在[mysqld]段下,不能写在[client]或[mysql]里 - Linux 下典型路径是
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf;Windows 是 MySQL 安装目录下的my.ini - 改完必须重启服务:
sudo systemctl restart mysql(Linux)或通过 Windows 服务管理器重启 - 验证是否生效:登录 MySQL 执行
SHOW VARIABLES LIKE 'skip_name_resolve';,返回ON才算成功
加了 skip-name-resolve 后权限突然失效?
启用后,MySQL 不再解析客户端 IP 对应的主机名,所有 GRANT 语句里的 HOST 部分必须用 IP 或 %,不能再用域名。
- 错误写法:
GRANT SELECT ON db.* TO 'user'@'app-server.local';→ 连接会被拒绝 - 正确写法:
GRANT SELECT ON db.* TO 'user'@'192.168.1.100';或'user'@'%'; - 已有用户需重置:先
DROP USER 'user'@'app-server.local';,再用 IP 重建 - 如果用通配符
%,注意它不匹配 localhost(Unix socket),本地连接需额外加'user'@'localhost'
Navicat 空闲后点表又卡住,和 DNS 无关
这不是反向解析问题,是连接被 MySQL 主动断开后 Navicat 还在复用旧连接。关键看两端超时是否对齐。
- 查服务端设置:
SHOW VARIABLES LIKE 'wait_timeout';(常见值为 60 或 300 秒) - 查 Navicat 设置:连接属性 → 高级 → 「保持连接间隔」,默认是 240 秒
- 若服务端
wait_timeout = 60,Navicat 却设 240,那连接早被 kill,心跳根本发不出 - 建议设为服务端值的 1/2 左右:比如服务端 300 → Navicat 设 120;服务端 60 → 设 30
- 顺带检查「使用压缩协议」是否勾选,它能缓解大查询中断后的静默失败问题
最易被忽略的是:skip-name-resolve 生效后,所有连接字符串、脚本、ORM 配置里的 host 字段,都得确认没混用域名——哪怕只有一处漏改,就会出现“部分能连、部分连不上”的碎片化问题。











