命令概述
mysql show full processlist 用来查看当前线程处理情况,具体信息请参考官网:https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html
show full processlist 返回的结果是实时变化的,是对 mysql 连接执行的现场快照,所以用来处理突发事件非常有用。
一般用到 show processlist 或 show full processlist 都是为了查看当前 mysql 是否有压力,都在跑什么语句,当前语句耗时多久了,有没有什么慢 SQL 正在执行之类的
可以看到总共有多少链接数,哪些线程有问题(time是执行秒数,时间长的就应该多注意了),然后可以把有问题的线程 kill 掉,这样可以临时解决一些突发性的问题。
有时候一个快照可能看不出问题,可以频繁刷新观察。
命令详解
下面来看一下运行:show full processlist命令的详解,我们可以通过三种方式来查看命令运行的结果:
1、通过 SHOW FULL PROCESSLIST 命令查看:
mysql> SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 1030455
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 1004
State: Has read all relay log; waiting for the slave
I/O thread to update it
Info: NULL
*************************** 3. row2、通过查询连接线程相关的表来查看快照:
select id, db, user, host, command, time, state, info
from information_schema.processlist
order by time desc下面针对每列做下介绍:
Id:连接 MySQL 服务器线程的唯一标识,可以通过 KILL 来终止此线程的连接。
User:当前线程连接数据库的用户
Host:显示这个语句是从哪个ip 的哪个端口上发出的。可用来追踪出问题语句的用户
db:线程连接的数据库,如果没有则为 null
Command: 显示当前连接的执行的命令,一般就是休眠或空闲(sleep),查询(query),连接(connect)
Time: 线程处在当前状态的时间,单位是秒
State:显示使用当前连接的 SQL 语句的状态(很重要)。请注意,State 只是语句执行过程中的某一个阶段。以查询为例,可能需要经过 Copying to tmp table、Sorting result、Sending data 等状态才可以完成。
Info: 线程执行的sql语句,如果没有语句执行则为null。这个语句可以使客户端发来的执行语句也可以是内部执行的语句
由于 Command 的状态大部分都是 Sleep,对分析问题帮助不大,因此可以通过如下语句排除 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)
通过前面的查询,我们查到了问题sql,通常会kill掉这个链接的线程,具体看官网文档:https://dev.mysql.com/doc/refman/5.7/en/kill.html
执行语句如下:
查询执行时间超过 2 分钟的线程,并拼接成 KILL 语句:
select concat('kill ', id, ';')
from information_schema.processlist
where command != 'Sleep'
and time > 2*60
order by time desc查看当前运行的所有事务,trx_started 指事务开始时间:
SELECT * FROM information_schema.INNODB_TRX order by trx_started;查看 MySQL 服务器状态信息:
show status like 'Threads%'在下一步我就不用说了吧,把拼接 kill 的执行结果跑一遍就搞定了,这个有时候非常好用,谁用谁知道
常见问题
一些问题会导致连锁反应,而且不太好定位,有时候以为是慢查询,很可能是大多时间是在等在CPU、内存资源的释放,所以有时候同一个查询消耗的时间有时候差异很大
总结了一些常见问题:
CPU报警:很可能是 SQL 里面有较多的计算导致的
连接数超高:很可能是有慢查询,然后导致很多的查询在排队,排查问题的时候可以看到”事发现场“类似的 SQL 语句一大片,那么有可能是没有索引或者索引不好使,可以用:explain 分析一下 SQL 语句