转载自:http://blog.csdn.net/phphot/article/details/4134913
最近发现两台MySQL server在中午的时候忽然(很突然的那种)发飙,不断的挂掉。重启mysql也尽是失败,看mysql的errorlog,只能看到类似如下的信息:
Forcing close of thread 12232 user: 'root'
用mysqladmin 简单的监控了下mysql的情况:
mysqladmin -uroot -p******** status -i 1
发现Queries per second avg只有200左右,可以说很低,但是Threads 确非常不稳定,居然会瞬间升级200以上,一般情况下这个线程这个值都是不会高于5的个位数!
然后继续看
mysqladmin -uroot -p******** processlist
居然有大量的unauthenticated user?? 如下情况
+------+-----------+---------+----+---------+------+-------+------------------+
[root@app028 ~]# mysqladmin -uroot -p************ processlist
+------+-----------+---------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+-----------+---------+----+---------+------+-------+------------------+
| 2007 | unauthenticated user | 192.168.4.29:58519 | | Connect | | login | |
| 2008 | unauthenticated user | 192.168.4.29:58553 | | Connect | | login | |
| 2009 | unauthenticated user | 192.168.4.29:58571 | | Connect | | login | |
| 2010 | unauthenticated user | 192.168.4.29:58577 | | Connect | | login | |
| 2011 | unauthenticated user | 192.168.4.29:58579 | | Connect | | login | |
| 2012 | unauthenticated user | 192.168.4.29:58589 | | Connect | | login | |
google了一下,
发现这算属MySQL的一个bug,不管连接是通过hosts还是ip的方式,MySQL都会对DNS做反查,IP到DNS,由于反查的接续速度过慢(不管是不是isp提供的dns服务器的问题或者其他原因),大量的查询就难以应付,线程不够用就使劲增加线程,但是却得不到释放,所以MySQL会“假死”。
解决的方案很简单,结束这个反查的过程,禁止任何解析。
打开mysql的配置文件(my.cnf),在[mysqld]下面增加一行:
skip-name-resolve
重新载入配置文件或者重启MySQL服务即可。
或是在运行时,增加参数:
/usr/local/mysql/bin/mysqld_safe --skip-name-resolve --user=mysql&
加 --skip-name-resolve 这么一个参数就可以,关闭mysql的dns反查功能。
更多的解决方案:
http://www.cnblogs.com/IvyCodingLife/p/3243420.html
公司的一个系统使用mysql数据库,局域网内访问时连接速度很慢,每次都要过十几秒后才能连上,只要连接上了速度正常。
在网上查了一下,发现了mysql有一个“反向解析”的问题:安装mysql后,默认 反向解析是打开的。不管你是使用域名还是
IP连接数据库,mysqld都会做一个反向解析的过程,即从 IP->dns的反查,反查的过程是很慢的而且是受ISP控制,所以一
旦ISP由于某些原因(这个也许有必要让系统工程师查查)而无法响应就会出现 前面所说的unauthenticated user,而
且mysql会出现停顿状态。解决的办法就是在my.cnf里面增加一个设置禁止mysql做任何解析的动作。
–skip-name-resolve
在做这个设置的之前一定要检查系统,将所有连接改写为IP连接,因为一旦此设置生效,mysql是无法进行域名解析的,原有的域名连接将全部失效。
但是奇怪的是,为什么征途服务器上有这个问题,老征途也是外网为什么没有这个问题,如果真是DNS解析问题的话应该大家都有才对...后来为了再此确实是DNS反向解析造成慢的问题,在一次验证中使用了telnet命令直接去连mysql端口,发现情况和后台连接一样,telnet征途服务器的mysql端口要等5秒才返回结果,其他的服务器telnet出去马上就返回了结果并且在这次验证中发现了返回的mysql版本,于是我明白了这可能和版本有关。我们征途服务器上mysql版本是5.1.67,S2和S3的内网服务器和老征途服务器上的mysql是5.5.23和5.5.29,所以应该是mysql后来的版本对这块有处理所以5.5的版本上没发现这个情况。
网上给出的解决方法有2种:
1.在my.cnf里加上skip-name-resolve禁止dns反解析。当然会有点问题http://www.jb51.net/article/30916.htm
2.在etc/hosts文件里直接把要连接的客户端IP加到这里来写成主机这样也可以不用进行DNS反解析了。 考虑到方法1改动太大而且要重启mysql,服务器上没办法做到。所以我用了方法2测试了一下。发现速度确实上来了,于是我最终确定问题的原因就是这个。 目前就使用了方法2把发布网页的IP地址加到征途服务器上etc/hosts中去。