服务器系统为Debian,上面装了LANP环境,并且有很多web项目,一直运行正常,但有天下午开始,网站访问变得很卡,MySQL连接时断时续,开始以为是网络波动或者其它小问题影响了服务的稳定性,观察了半天,发现还是很卡,于是开始查找原因。
首先登录服务器,把nginx、mysql、php全部重启,发现没有效果,输入“top”后,看到mysqld占用cpu比例高达200%~700%之间(8核CPU),原来问题是直接出现在mysql中
在服务器上执行mysql -u root -p之后,输入:set long_query_time=1;把慢查询时间设置为1秒,输入:show status like 'slow_queries';查询慢查询语句数量,结果返回0,证明mysql当前的高运行不是因为某些sql语句导致
再输入show full processlist; 可以看到正在执行的语句,发现正在执行的sql语句并不多,但是执行用户出现了大量“unauthenticated user”,这是未经证实的用户,于是怀疑,难道被黑客攻击了吗?但是仔细一看,所有连接均为localhost,排除攻击的可能
百度了一下,查到了解释:
不管连接是通过hosts还是ip的方式,MySQL都会对DNS做反查,IP到DNS,由于反查的接续速度过慢(不管是不是isp提供的dns服务器的问题或者其他原因),大量的查询就难以应付,线程不够用就使劲增加线程,但是却得不到释放,所以MySQL会“假死”。
解决的方案很简单,结束这个反查的过程,禁止任何解析。
打开mysql的配置文件(my.cnf),在[mysqld]下面增加一行:
skip-name-resolve
重新载入配置文件或者重启MySQL服务即可。
需要注意,这个配置生效后,127.0.0.1就不能连接mysql,只能使用localhost(用ip连接:skip-name-resolve在配置文件里设置成on, 然后重启mysql )
上一篇:MySQL的若干实用函数
下一篇:细说MySQL事务