mysql中的 skip-name-resolve 问题

本文介绍了在MySQL中遇到连接慢问题时,如何通过加入skip-name-resolve参数来提高登录速度,同时阐述了该参数可能带来的负面影响及合理使用时机。通过在my.ini文件中设置该参数,可以避免DNS解析导致的延迟,从而加速客户端登录过程。然而,此方法在本地服务器登录时可能导致权限不足的问题,因此需谨慎应用。

今天安装了个,重启时发现Error.log有下面提示:

 
1100616 21:05:15 [Warning] 'user' entry 'root@hexuweb101' ignored in --skip-name-resolve mode.
2100616 21:05:15 [Warning] 'user' entry '@hexuweb101' ignored in --skip-name-resolve mode.
 

产生的原因是 my.cnf 中我设置了 skip-name-resolve,skip-name-resolve是禁用dns解析,所以在mysql的授权表中就不能使用主机名了,只能使用IP 。

与是我删除了user table 中的host是域名项就可以了。

 

如果你有一个很慢的DNS和许多主机,你可以通过用--skip-name-resolve禁用DNS查找或增加HOST_CACHE_SIZE定义(默认值:128)并重新编译mysqld来提高性能。

你可以用--skip-host-cache选项启动服务器来禁用主机名缓存。要想清除主机名缓存,执行FLUSH HOSTS语句或执行mysqladmin flush-hosts命令。

如果你想要完全禁止TCP/IP连接,用--skip-networking选项启动mysqld。

 

 

***************************************************************

 

新加的一台服务器,连接内网中的一台mysql服务器的时候,经常出现超时。
登陆到mysql,查看进程的信息
show processlist;
发现大量的进程的状态为 login
原来默认的时候mysql启动时是不使用 skip-name-resolve选项的,这样的话,从其它主机的连接会比较慢,因为mysql会对这个ip做dns反向查询,导致大量的连接处于 login状态…..
解决这个问题有两个办法
一是加入 skip-name-resolve参数重启mysql
二是在 /etc/hosts中加入一句 192.168.0.2 server2 其中 192.168.0.2是新加的服务器的内网ip,server2是新服务器的主机名

在mysql客户端登陆mysql服务器的登录速度太慢的解决方案一篇文章中,我介绍了如何通过在my.ini文件(linux下是my.cnf文件)中 添加”SKIP-NAME-RESOLVE”的参数设置,使得客户端在登录服务器的时候不通过主机解析这一关,直接登陆的方法,以此来提高登录速度。

这里要介绍一下这种方法的负面作用,以及不合理的时机使用这种方法会引发的不可发现的错误。

首先,回顾一下在my.ini文件中添加”SKIP-NAME-RESOLVE”参数来提高访问速度的原理:

在没有设置该参数的时候,客户端在登陆请求发出后,服务器要解析请求者是谁,经过解析,发现登录者是从另外的电脑登录的,也就是说不是服务器本机,那么, 服务器会到mysql.user表中去查找是否有这个用户,假设服务器IP是192.168.0.1,而客户机的IP是192.168.0.2;那么查询 的顺序是先找‘root’@'192.168.0.2′这 个user是否存在,若存在,则匹配这个用户登陆,并加载权限列表。若没有该用户,则查找‘root’@'%’这个用户是否存在,若存在,则加载权限列表。否则,登 录失败。

在设置了SKIP-NAME-RESOLVE参数后,客户端的登录请求的解析式同上面一样的,但是在服务器本机的解析过程却发生了改变:服务器会把在本机 登录的用户自动解析为‘root’@'127.0.0.1′; 而不是‘root’@'localhost’;这样 一来就坏了,因为我们在服务器上登录是为了进行一些维护操作,但是显然,‘root’@'127.0.0.1′这个用户是被默认为‘root’@'%’这个用户的,这个用户还没有足够得权限去执行一些超 级管理员‘root’@'localhost’才能 执行的大作。因为未分配权限。

所以结论是:加入你在服务器本机上登录mysql服务器的话,要么先取消SKIP-NAME-RESOLVE的参数设置,重新启动服务器再登陆,设置完成 后,再设置上该参数;要么就给‘root’@'127.0.0.1′分 配超级管理员权限,但这么做显然是不明智的,因为任何人在任何机器上都可以用这个用户执行管理员操作,前提是知道了密码。

我有一次在mysql服务器上执行数据库创建脚本,并同时创建表、触发器、存储过程等。结果,总是失败,经过了一上午的折腾,最后发现时这个参数造成我以‘root’@'127.0.0.1′这个用户登陆了服 务器,这个用户没有创建触发器的权限。后来,取消了SKIP-NAME-RESOLVE参数后,执行成功,再把该参数设置回去。重启。OK。

所以,在设置这个参数的时候一定要注意时机:先用超级管理员将所有的用户创建好,再将权限分配好之后,才设置这个参数生效。

 
 
### 关于 `skip-name-resolve` 参数的作用 当在 MySQL 配置文件中设置 `skip-name-resolve=1` 或者通过启动选项 `--skip-name-resolve` 启动服务器时,该参数的主要作用是禁用基于主机名的 DNS 解析功能[^4]。这意味着 MySQL 将仅依赖 IP 地址来匹配客户端请求中的主机信息,而再尝试解析主机名为对应的 IP 地址。 #### 生效条件 为了使 `skip-name-resolve` 设置生效,需满足以下条件之一: 1. **修改配置文件**:在 MySQL 的配置文件(通常是 `my.cnf` 或 `my.ini` 文件)中添加如下内容并重启服务: ```ini [mysqld] skip-name-resolve=1 ``` 2. **命令行启动选项**:通过指定 `--skip-name-resolve` 作为 mysqld 进程的启动参数运行 MySQL 数据库实例。 无论采用哪种方式,都需要确保 MySQL 实例被重新启动以便加载新的配置项[^3]。 #### 参数的具体作用 启用此参数后,MySQL 再执行反向域名解析操作,从而可以显著减少因网络延迟或其他原因引起的性能问题。然而需要注意的是,在这种模式下创建用户账户时应使用具体的 IP 地址而非模糊的主机名称形式(如 `%`),因为后者可能会按预期工作。 如果存在一些已有的权限表条目指定了特定主机名而是对应IP地址,则这些记录可能会导致访问失败的情况发生。因此建议清理掉所有非 localhost 的 hostname 类型授权记录后再实施更改[^1]: ```sql DELETE FROM mysql.user WHERE Host != 'localhost'; FLUSH PRIVILEGES; ``` 另外还可以查询当前系统里有哪些用户的 host 字段是本地回环地址的信息以辅助判断哪些地方需要调整[^2]: ```sql SELECT User,Host FROM mysql.user WHERE Host <> 'localhost'; ``` 最后提醒一点就是确认防火墙规则允许来自目标机器上的 TCP/IP 流量到达数据库端口上。 ### 总结 综上所述,`skip-name-resolve=1` 主要用于关闭 MySQL 对客户端连接发起时所携带主机名做正向/逆向DNS查找的行为;它的实际效果取决于是否正确设置了相关联的安全策略以及物理环境下的连通状况等因素共同决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值