新加的一台服务器,链接内网中的一台mysql服务器的时候,常常出现超时。mysql
登录到mysql,查看进程的信息
代码以下:
show processlist;linux
发现大量的进程的状态为 login
原来默认的时候mysql启动时是不使用 skip-name-resolve选项的,这样的话,从其它主机的链接会比较慢,由于mysql会对这个ip作dns反向查询,致使大量的链接处于 login状态....
.
解决这个问题有两个办法sql
一是加入 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"的参数设置,使得客户端在登陆服务器的时候不经过主机解析这一关,直接登录的方法,以此来提升登陆速度。server
这里要介绍一下这种方法的负面做用,以及不合理的时机使用这种方法会引起的不可发现的错误。dns
首先,回顾一下在my.ini文件中添加"SKIP-NAME-RESOLVE"参数来提升访问速度的原理:进程
在没有设置该参数的时候,客户端在登录请求发出后,服务器要解析请求者是谁,通过解析,发现登陆者是从另外的电脑登陆的,也就是说不是服务器本机,那么,服务器会到mysql.user表中去查找是否有这个用户,假设服务器IP是192.168.0.1,而客户机的IP是192.168.0.2;那么查询的顺序是先找'root'@'192.168.0.2'这个user是否存在,若存在,则匹配这个用户登录,并加载权限列表。若没有该用户,则查找'root'@'%'这个用户是否存在,若存在,则加载权限列表。不然,登陆失败。ip
在设置了SKIP-NAME-RESOLVE参数后,客户端的登陆请求的解析式同上面同样的,可是在服务器本机的解析过程却发生了改变:服务器会把在本机登陆的用户自动解析为'root'@'127.0.0.1';而不是'root'@'localhost';这样一来就坏了,由于咱们在服务器上登陆是为了进行一些维护操做,可是显然,'root'@'127.0.0.1'这个用户是被默认为'root'@'%'这个用户的,这个用户尚未足够得权限去执行一些超级管理员'root'@'localhost'才能执行的大做。由于未分配权限。ssl
因此结论是:加入你在服务器本机上登陆mysql服务器的话,要么先取消SKIP-NAME-RESOLVE的参数设置,从新启动服务器再登录,设置完成后,再设置上该参数;要么就给'root'@'127.0.0.1'分配超级管理员权限,但这么作显然是不明智的,由于任何人在任何机器上均可以用这个用户执行管理员操做,前提是知道了密码。
我有一次在mysql服务器上执行数据库建立脚本,并同时建立表、触发器、存储过程等。结果,老是失败,通过了一上午的折腾,最后发现时这个参数形成我以'root'@'127.0.0.1'这个用户登录了服务器,这个用户没有建立触发器的权限。后来,取消了SKIP-NAME-RESOLVE参数后,执行成功,再把该参数设置回去。重启。OK。
因此,在设置这个参数的时候必定要注意时机:先用超级管理员将全部的用户建立好,再将权限分配好以后,才设置这个参数生效。