mysql cpu暴涨快速排查方法

2022-05-20  本文已影响0人  柯柏笔记

1. 获取mysql进程Id

ps -ef |grep -i mysql
image.png

2. 实时查看mysql进程中占用cpu,内存最多的操作系统线程Id

top -Hp 6132
image.png

3. 根据操作系统线程id,查看mysql数据库中对应的线程id,根据mysql数据库的线程id获取sql

mysql -u root -P 3306 -h 127.0.0.1 -p
一般情况,root用户只允许本地登录,是不允许远程登录,为了安全性
select thread_id,name ,PROCESSLIST_ID,THREAD_OS_ID from performance_schema.threads where thread_os_id =136942 ;
image.png

标红的是mysql的线程id

select sql_text from performance_schema.events_statements_current where thread_id =1254;
select sql_text from performance_schema.events_statements_current 
where thread_id in ( select thread_id from performance_schema.threads where thread_os_id = 408271);
image.png
show  processlist;
ps:Id为mysql线程id
image.png
select sql_text from performance_schema.events_statements_current where
 thread_id in (select thread_id from performance_schema.threads where processlist_id = 15396);
image.png

4. 事务卡住情况

mysql> SELECT * FROM information_schema.INNODB_TRX;
mysql> SELECT * FROM information_schema.INNODB_LOCKs;
mysql> SELECT * FROM information_schema.INNODB_LOCK_waits;

解释:看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID是否在show processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一直没有commit或者rollback而是卡住了,我们需要手动kill掉。

搜索的结果是在事务表发现了很多任务,这时候最好都kill掉。

批量删除事务表中的事务

我这里用的方法是:通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令。

mysql> select concat('KILL ',id,';') from information_schema.processlist p inner
 join information_schema.INNODB_TRX x on p.id=x.trx_mysql_thread_id where db='test';
+------------------------+
| concat('KILL ',id,';') |
+------------------------+
| KILL 588379;           |
| KILL 588313;           |
| KILL 588275;           |
+------------------------+
3 rows in set

kill掉以后再执行SELECT * FROM information_schema.INNODB_TRX; 就是空了。

这时候系统就正常了

上一篇下一篇

猜你喜欢

热点阅读