mysql慢SQL排查之show processlist和show full processlist
mysql排查线上数据库问题,经常会用到 show processlist和show full processlist这两条命令
processlist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态帮助识别出有问题的查询语句等。
如果是root帐号,能看到所有用户的当前连接。如果是其他普通帐号,则只能看到自己占用的连接。showprocesslist只能列出当前100条。如果想全部列出,可以使用SHOW FULL PROCESSLIST命令
各个列的含义:
1、id列,用户登录mysql时,系统分配的"connection_id",可以使用函数connection_id()查看
2、user列,显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句
3、host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户
4、db列,显示这个进程目前连接的是哪个数据库
5、command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等
6、time列,显示这个状态持续的时间,单位是秒
7、state列,显示使用当前连接的sql语句的状态,很重要的列。state描述的是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过copying
to tmp table、sorting result、sending data等状态才可以完成
8、info列,显示这个sql语句,是判断问题语句的一个重要依据,一般记录的是线程执行的语句。默认只显示前100个字符,也就是你看到的语句可能是截断了的,要看全部信息,需要使用 show full processlist。
备注:
1、按客户端的 IP 分组,查看各个客户端的链接数情况
select
client_ip,
count
(client_ip)
as
client_num
from
(
select
substring_index(host,
':'
,1)
as
client_ip
from
information_schema.processlist )
as
connect_info
group
by
client_ip
order
by
client_num
desc
;
select
*
from
information_schema.processlist
where
Command !=
'Sleep'
order
by
Time
desc
;
select
concat(
'kill '
, id,
';'
)
from
information_schema.processlist
where
Command !=
'Sleep'
and
Time
> 60
order
by
Time
desc
;