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,用root用户连接
mysql -u root -P 3306 -h 127.0.0.1 -p
一般情况,root用户只允许本地登录,是不允许远程登录,为了安全性
- 根据操作系统的线程id,查询可疑的mysql的线程id
select thread_id,name ,PROCESSLIST_ID,THREAD_OS_ID from performance_schema.threads where thread_os_id =136942 ;
image.png
标红的是mysql的线程id
- 根据mysql的线程id,查询具体的sql
select sql_text from performance_schema.events_statements_current where thread_id =1254;
- 也可以两个sql,一起使用
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
- 在mysql内部,快速查看可疑sql内容
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; 就是空了。
这时候系统就正常了