应关闭mysql的dns反向解析,即在my.cnf的[mysqld]段添加skip-name-resolve并重启服务;生效后需将授权语句中的域名host改为ip或%,并执行flush privileges。

远程连接 MySQL 时卡在权限验证阶段(比如 mysql -h x.x.x.x -u user -p 输入密码后几秒甚至几十秒才响应),大概率不是网络不通,而是服务端在做 DNS 反向解析 —— 它试图把你的客户端 IP 解析成域名,而这个过程被卡住了。
为什么输入密码后要等很久才进数据库?
MySQL 默认启用 skip-name-resolve 关闭前,每个新连接都会触发 gethostbyaddr_r() 调用。如果客户端 IP 所在的 DNS 域名无法快速反解(比如私有云、NAT 环境、DNS 服务器 unreachable),线程就阻塞在那儿,直到超时(通常是 30 秒)。这不是权限校验慢,是根本还没走到权限校验那步。
- 现象典型:本地连很快,远程连极慢;
SHOW PROCESSLIST里能看到状态为Connecting to master或空状态,持续数秒以上 - 验证方法:临时用
telnet host 3306测试端口通不通 —— 如果秒通,说明问题出在 MySQL 层而非网络层 - 注意:
skip-name-resolve生效后,所有GRANT语句里的host必须用 IP 或%,不能再写域名(如'user'@'web-server.local'会失效)
如何确认并关闭 DNS 反向解析?
直接改配置最可靠。别依赖运行时 SET,它不生效 —— skip-name-resolve 是启动参数,必须写进配置文件再重启 mysqld。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 编辑
/etc/my.cnf或/etc/mysql/my.cnf,在[mysqld]段落下加一行:skip-name-resolve - 检查是否已有重复项(比如某些一键安装包会自带该配置但被注释掉)
- 重启服务:
sudo systemctl restart mysql(或mysqld,依实际服务名而定) - 验证是否生效:执行
SELECT @@skip_name_resolve;,返回1表示已启用
改完还慢?排查这三处干扰点
即使关了 DNS 解析,仍可能卡住,常见于云环境或高安全策略场景:
-
bind-address配置错误:确保bind-address = 0.0.0.0或显式列出监听 IP,否则只监听127.0.0.1,远程请求根本进不来 - SSL 协商耗时:若服务端强制 SSL 且证书链不完整,客户端握手会卡顿。临时加
?ssl-mode=DISABLED测试(生产慎用) - 客户端自动补全(-A 缺失):命令行连库时没加
-A(即--disable-auto-rehash),客户端会主动拉取所有库表元数据,表多时耗时显著 —— 加上它就能秒进
真正麻烦的不是配置本身,而是 skip-name-resolve 启用后,所有现有基于主机名的授权记录都失效。你得批量更新 mysql.user 表里的 host 字段,或者重跑 GRANT 语句 —— 这一步漏掉,就会变成“连得快,但报 Access denied”。










