mysql 使用的是阿里云的RDS。某天 cpu 突然负载过高报警。
首先查询了连接数
netstat -nt |grep 3306 | wc -l
发现各台服务器上的mysql 连接数都不高。
于是猜测是某些查询有问题。
然后查看下mysql进程是否有锁
mysql -h xxx.mysql.rds.aliyuncs.com -u xxx -p -e "show processlist" | grep -i "locked" > locked.log
发现没有锁操作。但是用showprocess 看了下有很多时间超长的,最长的甚至超过1000s。
这个时候mysql压力很大,后续还有写操作堆积,只好先把这些有问题的超慢查询kill掉。
#查出慢查询的mysql进程id
mysql -h xxx.mysql.rds.aliyuncs.com -u xxx -p -e "show processlist" | awk '{if ($6 > 1000) print $1}' > long.log
#将要kill的进程id 变成 sql
for line in `cat long.txt`;do echo "kill $line;" > kill.sql; done
mysql -h xxx.mysql.rds.aliyuncs.com -u xxx -p < kill.sql
效果很明显 当然负作用也很大,那些没来得及写入的数据就丢掉了