必须开启 skip-name-resolve = ON,否则新连接会因DNS反向解析阻塞数秒甚至超时;需在[mysqld]段配置并重启MySQL,且授权表Host字段必须改为IP或%,否则连接失败。

必须开启 skip-name-resolve = ON,否则新连接会卡在 DNS 反查上,尤其在 DNS 延迟高或不可用时,首连可能耗时数秒甚至超时。
为什么远程连得慢、本地连得快?
MySQL 默认对每个新 TCP 连接(无论 127.0.0.1 还是 192.168.1.100)都做 DNS 反向解析:先拿客户端 IP 查主机名,再拿主机名反查 IP 验证一致性。这个过程在 DNS 响应慢、超时或返回 NXDOMAIN 时会阻塞整个连接线程。
现象典型表现为:
-
mysql -h 127.0.0.1 -u user秒连,mysql -h 192.168.1.100 -u user卡 2–5 秒 -
SELECT USER(), CURRENT_USER();显示的 host 是user@some-hostname而非user@192.168.1.100 -
SHOW PROCESSLIST;中 state 长时间停在Checking permissions
如何正确配置并验证生效?
编辑 /etc/my.cnf(Linux)或 my.ini(Windows),在 [mysqld] 段下添加:
[mysqld] skip-name-resolve = ON
然后重启 MySQL:systemctl restart mysqld 或 service mysql restart。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
验证是否启用:
- 执行
SELECT @@skip_name_resolve;—— 返回1表示成功 - 检查
SHOW VARIABLES LIKE 'skip_name_resolve';—— Value 列为ON - 观察错误日志,不应再出现
gethostbyaddr_r failed类警告
开了之后权限表怎么写才不掉链子?
skip-name-resolve 开启后,MySQL 不再尝试解析 IP 对应的 hostname,只认字面 IP 或通配符 %。这意味着原来靠 GRANT ... ON *.* TO 'user'@'app-server.example.com' 授权的账号会立即失效。
必须立刻修正权限表中的 host 字段:
- 把所有域名类 host(如
'db-admin.example.com'、'localhost')替换为对应 IP 或'%' -
'localhost'特别危险:它匹配 Unix socket,但不匹配 TCP 的127.0.0.1;若需本地 TCP 连接,必须显式创建'user'@'127.0.0.1' - 执行
FLUSH PRIVILEGES;生效,不要依赖缓存 - 建议用
SELECT User, Host FROM mysql.user;全局检查,确保无残留域名 host
容易被忽略的兼容性细节
这个参数不是“开就完事”,它会影响三类实际行为:
- 监控工具(如 Prometheus + mysqld_exporter)若用 hostname 连接,也会失败,需同步改用 IP
- 某些旧版客户端驱动(如 MySQL Connector/J 5.1.x)在 URL 中含
useSSL=false&allowPublicKeyRetrieval=true时仍可能触发解析,建议升级到 8.0+ 驱动 - 如果业务代码里硬编码了
jdbc:mysql://db.example.com:3306/...,DNS 解析失败时连接池初始化就会 hang 住,必须改为 IP 或确保 DNS 稳定
真正麻烦的不是加参数,而是授权表迁移和上下游连接方式的同步改造——漏掉任意一环,都会导致“配置生效了,但连不上”。

















