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
原文地址:https://www.cnblogs.com/654wangzai321/p/8000815.html