生产环境CPU飙高

出现CPU飙高时操作

出现cpu飙高时使用先试用top命令查看进程,确定是java进程还是mysql 找到进程号

一、如果是mysql进程

1、那么使用mysql终端或者数据库链接工具执行如下sql语句查看正在执行的sql:show processlist

2、查询慢sql,截取慢sql文件前面10000行数据导出来分析

  • 开启慢sql
    ##进入mysql终端
    show global variables like '%query%';
    #开启慢sql
    set global slow_query_log=1;
    #10s以上的sql才记录慢sql
    set global long_query_time=10;
    
  • 使用mysqldumpslow分析
    -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default
                al: average lock time
                ar: average rows sent
                at: average query time
                 c: count
                 l: lock time
                 r: rows sent
                 t: query time  
    -r           reverse the sort order (largest last instead of first)
    -t NUM       just show the top n queries
    -a           don't abstract all numbers to N and strings to 'S'
    -n NUM       abstract numbers with at least n digits within names
    -g PATTERN   grep: only consider stmts that include this string
    -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
               default is '*', i.e. match all
    -i NAME      name of server instance (if using mysql.server startup script)
    -l           don't subtract lock time from total time
    

例如:
1、得到返回记录行数最多的1000条SQL语句(行数最多排序需要 -s r ;限制1000条需要 -t 1000)
mysqldumpslow -s r -t 1000 /home/lgx/mysql/mysql-slow.log > /tmp/mysql-slow-tmp.log

2、得到访问次数最多的1000个SQL(访问次数最多排序需要 -s c ;限制1000条需要 -t 1000)
mysqldumpslow -s c -t 1000 /home/lgx/mysql-slow.log > /tmp/mysql-slow-tmp.log

3、得到按照执行时间排序的前10条,且sql语句里面含有左连接的查询语句(执行时间排序需要 -s t;限制10条需要 -t 1000)
mysqldumpslow -s t -t 1000 -g “left join” /home/lgx/mysql-slow.log > /tmp/mysql-slow-tmp.log

3、查询进行中的事务,SELECT * FROM information_schema.INNODB_TRX

二、如果是java进程

1、执行命令查看占用最高的线程 :top -H -p
2、把线程占用最高的id转换为16进制 :printf “0x%x\n”
3、打印线程堆栈 :jstack > /home/finance/jstack.log
4、打开jstack.log 找到步骤3中的十六进制线程号 进行分析 搜索:nid= 找到线程名和代码位置

事后分析

一、mysql

1、分析show processlist 结果中的info查看sql问题,首先使用explain查看执行计划效率,如果效率无问题,查看是否调用频繁比如循环中不停调用
2、分析慢sql使用explain查看执行计划,效率有问题优化sql、优化索引
3、是否有事务死锁,如果有查看原因

二、JAVA

jsatck.log定位到代码后直接分析代码

你可能感兴趣的:(mysql,数据库)