美文网首页
mysql cpu暴涨快速排查方法

mysql cpu暴涨快速排查方法

作者: 柯柏笔记 | 来源:发表于2022-05-20 15:03 被阅读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; 就是空了。

    这时候系统就正常了

    相关文章

      网友评论

          本文标题:mysql cpu暴涨快速排查方法

          本文链接:https://www.haomeiwen.com/subject/gtufprtx.html