mysql show processlist 排查问题

发布时间 2023-10-09 12:32:08作者: 鼬先生*

一,命令概述

mysql show processlist ; 用来查看当前线程处理的情况

show full processlist 返回的结果是实时变化的,是对mysql连接执行的现场快照,所以用来处理突发事件将是非常有用的。

一般用到show processlist 和show full processlist 都是为了查看当前mysql是否有压力,都在跑什么语句,当前语句耗时多久了,有没有慢sql在执行之类的。

##有时候一个快照看不出来什么,频繁刷新一下

也可以通过navicate 工具的tool ->服务器监控下去勾选自己的masql去查看

 

 

 

Id:链接mysql 服务器线程的唯一标识,可以通过kill来终止此线程的链接。

User:当前线程链接数据库的用户

Host:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户

db: 线程链接的数据库,如果没有则为null

Command: 显示当前连接的执行的命令,一般就是休眠或空闲(sleep),查询(query),连接(connect)

Time: 线程处在当前状态的时间,单位是秒

State:显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个 sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成

Info: 线程执行的sql语句,如果没有语句执行则为null。这个语句可以使客户端发来的执行语句也可以是内部执行的语句

 

由于command的状态大部分都是sleep对我们分析问题没有什么作用,所以我们可以通如下语句来排除sleep状态的线程;

select id, db, user, host, command, time, state, info
from information_schema.processlist
where command != 'Sleep'
order by time desc

这样就能过滤出来哪些正在干过的,然后按照消耗时间倒序展示,排在最前面的,极大可能就是有问题的链接然后查看info一列,就能看到对应的执行的什么sql了

 

 

 

三 ,kill的使用

kill+进程号 可以删除对应的进程,

select concat('kill',id,';' ) from information_schema.processlist where comman !='sleep' and time >2*60 order by time desc;

 

总结了一些常见问题:

  • CPU报警:很可能是 SQL 里面有较多的计算导致的
  • 连接数超高:很可能是有慢查询,然后导致很多的查询在排队,排查问题的时候可以看到”事发现场“类似的 SQL 语句一大片,那么有可能是没有索引或者索引不好使,可以用:explain 分析一下 SQL 语句