mysql慢查询导致故障
原因:
网站访问很慢,报警php进程数过大
排查及处理:
1.首先查看服务器监控和mysql监控,分析服务器是否负载过大,受到攻击,以及mysql性能方面是否正常
2.发现只读数据库服务器cpu利用率100%,show processlist,发现有很多慢查询,为先保证业务正常运行,先通过mysqladmin processlist -uusername -ppassword查看到连接的进程(使用哪个用户登录,只能查看到该用户下面运行的线程) ,直接kill掉query花时较长的线程。cpu负载慢慢就降下来了,等恢复稳定,然后再优化慢查询。
操作流程:
mysqladmin full processlist -uusername -ppassword 查看所有连接的线程,分别为:id,user,host,db,command,time,state,info
id表示标识,kill时直接跟id
user表示当前连接用户
db表示当前进程连接哪个数据库
command表示当前连接执行的命令:sleep休眠,query查询,connect连接
state表示语句执行中的某一个状态或者一个sql语句
info表示执行的语句(sql语句或者命令)
kill掉线程:
mysqladmin processlist -uusername -ppassword kill $id
如果mysql中有大量sleep线程不释放,导致max_connections连接数过大(show variables like "max_connections"来查看设置的最大连接数),可以kill掉这些sleep连接,以下为shell脚本:
#!/bin/sh username= passwd= host= while : do n=`mysqladmin processlist -u$username -p$passwd -h$host | grep -i sleep | wc -l` date=`date +%Y%m%d[%H:%M:%S]` echo $n if [ "$n" -gt 50 ];then for i in `mysqladmin processlist -u$user -p$passwd -h$host | grep -i sleep | awk '{print $2}'`;do mysqladmin -u$user -p$passwd -h$host kill $i done echo "sleep is too many I killed it " >> /tmp/sleep.log echo "$date : $n" >> /tmp/sleep.log fi sleep 1 done