mysql 问题排查: show processlist

1、查询线程及相关信息

show processlist 是显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。

除非单独个这个用户赋予了PROCESS 权限。

单独给activiti用户授PROCESS权限,(授权后需要退出重新登录)

show processlist 显示的信息都是来自MySQL系统库 information_schema 中的 processlist 表。所以使用下面的查询语句可以获得相同的结果:

select * from information_schema.processlist;

进程信息也可从performance_schema.threads表中获得。但是,访问threads不需要互斥锁,对服务器性能影响最小。information_schema.processlistshow processlist由于需要互斥锁而具有负面的性能后果。performance_schema.threads还显示有关后台线程,哪些信息在information_schema.processlist和show processlist中没有,这意味着performance_schema.threads可以用来监视活动的其他线程信息源。

1.1、各个列的含义:

id列:唯一连接标识。SHOW PROCESSLIST语句所示Id的值,performance_schema.threadsPROCESSLIST_ID的值,mysql 线程 connection_id() 函数返回的值,与此值是一样的。

user列:显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句。

值为 system user 代表是服务器内部执行任务的无客户端线程,比如,一个 delayed-row 处理线程或者主从复制的一个 I/O or SQL 线程。对于 system user,在 Host column不指定任何Host值。值为unauthenticated user 代表已经建立了连接但是客户端用户还没有认证通过的线程。值为 event_scheduler 代表监控 scheduled events 的线程。

host列:显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户。

db列:显示这个进程目前连接的是哪个数据库。如果没有指定数据库,则该值为 NULL 。

command列:显示此刻该线程正在执行的命令,一般取值为休眠(sleep)查询(query)连接(connect)

time列:显示这个状态持续的时间,单位是秒。

state列:显示使用当前连接的sql语句的状态,很重要的列。state描述的是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过copying to tmp table、sorting result、sending data等状态才可以完成。

info列:记录的是线程执行的语句。默认只显示前100个字符,也就是你看到的语句可能是截断了的,要看全部信息,需要使用 show full processlist

1.2、 Command 列的值 详解:

Binlog Dump: 主节点正在将二进制日志 ,同步到从节点。

Change User: 正在执行一个 change-user 的操作。

Close Stmt: 正在关闭一个Prepared Statement 对象。

Connect: 一个从节点连上了主节点。

Connect Out: 一个从节点正在连主节点。。

Create DB: 正在执行一个create-database 的操作。

Daemon: 服务器内部线程,而不是来自客户端的链接。

Debug: 线程正在生成调试信息。

Delayed Insert: 该线程是一个延迟插入的处理程序。

Drop DB: 正在执行一个 drop-database 的操作。

Execute: 正在执行一个 Prepared Statement。

Fetch: 正在从Prepared Statement 中获取执行结果。

Field List: 正在获取表的列信息。

Init DB: 该线程正在选取一个默认的数据库。

Kill : 正在执行 kill 语句,杀死指定线程。。

Long Data: 正在从Prepared Statement 中检索 long data。

Ping: 正在处理 server-ping 的请求。

Prepare: 该线程正在准备一个 Prepared Statement。

ProcessList: 该线程正在生成服务器线程相关信息。。

Query: 该线程正在执行一个语句。

Quit: 该线程正在退出。

Refresh:该线程正在刷表,日志或缓存;或者在重置状态变量,或者在复制服务器信息。

Register Slave: 正在注册从节点。

Reset Stmt: 正在重置 prepared statement。

Set Option: 正在设置或重置客户端的 statement-execution 选项。

Shutdown: 正在关闭服务器。

Sleep: 正在等待客户端向它发送执行语句

Statistics: 该线程正在生成 server-status 信息。

Table Dump: 正在发送表的内容到从服务器。

Time: Unused。

2、按客户端 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;

3、查看正在执行的线程,并按 Time 倒排序,看看有没有执行时间特别长的线程

SELECT
	* 
FROM
	information_schema.PROCESSLIST 
WHERE
	Command != 'Sleep' 
ORDER BY
	Time DESC;

4、查询超过指定时间的线程

找出所有执行时间超过 5 分钟的线程,拼凑出 kill 语句,方便后面查杀 (此处 5分钟 可根据自己的需要调整SQL标红处)

可复制查询结果到控制台,直接执行,杀死堵塞进程

-- 找出所有执行时间超过 5 分钟的线程,拼凑出 kill 语句
SELECT
	concat( 'kill ', id, ';' ) 
FROM
	information_schema.PROCESSLIST 
WHERE
	Command != 'Sleep' 
	AND Time > 300 
ORDER BY
	Time DESC;

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值