1、查询线程及相关信息
show processlist 是显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。
除非单独个这个用户赋予了PROCESS 权限。
单独给activiti用户授PROCESS权限,(授权后需要退出重新登录)
show processlist 显示的信息都是来自MySQL系统库 information_schema 中的 processlist 表。所以使用下面的查询语句可以获得相同的结果:
select * from information_schema.processlist;
进程信息也可从performance_schema.threads表中获得。但是,访问threads不需要互斥锁,对服务器性能影响最小。information_schema.processlist和show processlist由于需要互斥锁而具有负面的性能后果。performance_schema.threads还显示有关后台线程,哪些信息在information_schema.processlist和show processlist中没有,这意味着performance_schema.threads可以用来监视活动的其他线程信息源。
1.1、各个列的含义:
id列:唯一连接标识。SHOW PROCESSLIST
语句所示Id
的值,performance_schema.threads
表PROCESSLIST_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;