[Mysql] mysql show processlist详解


本文总阅读量

0、show processlist查看正在运行的线程,如果你有process权限,能够看到所有的线程,如果没有权限只能看到自己的线程。

有管理员权限的用户,如下图所示:

没有管理权限的用户,如下图所示::

如果不加full关键字,每条语句的info信息栏只能显示前100个字符。
如果看到“too many connections”的错误信息,想要看看什么线程正在运行,使用show processlist语句是很有用的。mysql数据库会额外保持一个连接,供具有connection_admin或者super权限用户的使用,用以确保管理员能随时连接进来检查系统状况(假设你没有将此权限授予所有用户)。
show processlist输出列详解:

1、id:连接标识符,与INFORMATION_SCHEMA PROCESSLIST表的id列显示的是同类型的值,如下图所示:


Performance_Schema threads表的processlist_id列也是相同值,由connection_id())函数返回值。

通过kill 语句可以杀掉查询到的线程,执行命令如下:

1
kill id号

2、user: 代表数据库用户,如果是system user代表非客户端线程,是服务器发起的处理内部事务的线程。这些线程可能是io线程、复制从库的sql线程、延迟行处理线程。对于system user,host列没有任何信息。 unauthenticated user是有客户端发起的,但是尚未对客户端用户进行验证的线程。event_scheduler 是监控调度事件的线程。

3、host:发起线程的客户的主机名(对于system user,host这一列为空)。tcp/ip连接的主机名是:hostname:client_port格式,用这种格式来更方面查看客户端在做什么操作。

4、db:如果指定了库名,会使用当前的库名;如果没有则为空。

5、command:线程的命令类型。下面列举几种常见的线程命令,如果想查看详细信息点击此处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
connect:从复制已经连接到主库
connect out:从复制正在连接到主库
create db:正在执行一个创建库的操作。
execute:正在执行一个准备好的语句。
field list:提取表列信息线程
kill:当前线程被其他线程杀掉。
query:正在整型一条语句。
quit:线程被终止。
refresh:刷新表、日志、缓存、重置状态变量值或从服务信息线程。
shutdown:关闭服务线程
sleep:等待客户端发送一条新语句线程。
table dump:发送表内容到从服务器
statics:获取当前服务状态信息。
如果一个线程耗时比较久,需要重点关注造成该线程。

6、time:当前线程耗时。对于slave sql 线程,该值代表最后一次复制时间的时间戳和从服务器的真正时间的秒数。

7、state:行为,事件,状态指明当前线程在做什么。下面列举几种常见状态值,查看详细信息点击此处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
after create:执行完create table函数之后,创建表的线程(包括内部临时表),即使因为某些错误创建表失败,该状态也会显示。
analyzing:统计myisam表键分布(例如执行analyze table)
checking permissions:检查是否有权限执行该语句。
check tables:执行表检查操作。
cleaning up:线程正在处理一条命名,准备释放内存重置某些状态变量。
closing tables:刷新更改的表到磁盘,关闭使用的表。该操作应该快速完成,如果没有,请确保是否有足够的磁盘空间或者磁盘io是否太高。
copy to tmp table:处理alter table语句。该状态发生在表新结构被创建之后,行数据被拷贝到表之前。
copying to group table:该执行语句中order by和group by有不同的关键字,行被组处理拷贝到临时表。
copying to tmp table:正在复制内存中的临时表。
altering table:正在执行alter table
Copying to tmp table on disk:正在拷贝临时表到磁盘。临时结果变得太大,因此,线程将临时表从内存转到磁盘来节省内存。
creating index:对myisam表进行alter table ... enable keys操作
creating sort index:使用内部临时表处理一个select语句。
creating table:正在创建表(包括创建临时表)
creating tmp table:在内存或磁盘创建一个临时表。如果一个表刚开始再内存创建,之后转到磁盘,该状态会变为:Copying to tmp table on disk。
committing alter table to storage engine:alter table已经执行完成,正在提交 结果。
executing:已经开始执行一个语句
freeing items:已经执行了一个命令,该状态通常在cleaning up之后。
query end:,在freeing items状态之前,处理一个查询之后
logging slow query:写语句到slow-query日志
sending data:正在读取和处理一个select语句的行,并发送数据到客户端,因为可能会发生物理读,该状态可能是给定生命周期时间最长的。
update:准备更新表
updating:正在搜索更新的行,并更新他们
system lock:调用了mysql_lock_tables()函数,线程状态一直没有更新。产生该问题原因很多:
比如:请求或等待一个表的内部或者外部系统锁。当innodb等待一个表锁等级为lock tables时会发生。如果这个问题是由请求外部锁,并且你没有用多个mysqld服务访问相同的myisam引擎表,你可以通过参数 --skip-external-locking禁用外部系统锁。但是外部锁默认情况下是禁用的,因此该参数可能没有影响。对于show profile命令,该状态代表正在请求锁(不是在等待锁)
对于系统表锁状态是Locking system tables。
waiting for commit lock:flush tables with read lock正在等待一个commit 锁
waiting for tables:线程收到通知,表的底层架构已经更改,需要重新打开表后去一个新的结构。但是重新打开一个表,需要等待其他正在访问该表的线程。
通常在其他线程使用flush tables或者执行下面语句: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, or OPTIMIZE TABLE. 时会发生此通知。

8、info:正在执行的语句,如果没有语句则为空。语句可能是发送的服务端的,或一个内部语句(如果一个语句执行其他语句)例如:call调用一个(select语句)存储过程,info值会显示select语句。

9、另外使用mysqladmin processlist也可以查看进程信息,如下图所示:

10、如果想通过sql命令去获取自己设定的行,可按以下方法设置:

1
2
select * from information_schema.processlist where state !=' ';
![](https://i.imgur.com/pGGuMER.png)

可根据自己需求添加条件。

目录
  1. 1. 0、show processlist查看正在运行的线程,如果你有process权限,能够看到所有的线程,如果没有权限只能看到自己的线程。
  2. 2. 1、id:连接标识符,与INFORMATION_SCHEMA PROCESSLIST表的id列显示的是同类型的值,如下图所示:
  3. 3. 2、user: 代表数据库用户,如果是system user代表非客户端线程,是服务器发起的处理内部事务的线程。这些线程可能是io线程、复制从库的sql线程、延迟行处理线程。对于system user,host列没有任何信息。 unauthenticated user是有客户端发起的,但是尚未对客户端用户进行验证的线程。event_scheduler 是监控调度事件的线程。
  4. 4. 3、host:发起线程的客户的主机名(对于system user,host这一列为空)。tcp/ip连接的主机名是:hostname:client_port格式,用这种格式来更方面查看客户端在做什么操作。
  5. 5. 4、db:如果指定了库名,会使用当前的库名;如果没有则为空。
  6. 6. 5、command:线程的命令类型。下面列举几种常见的线程命令,如果想查看详细信息点击此处
  7. 7. 6、time:当前线程耗时。对于slave sql 线程,该值代表最后一次复制时间的时间戳和从服务器的真正时间的秒数。
  8. 8. 7、state:行为,事件,状态指明当前线程在做什么。下面列举几种常见状态值,查看详细信息点击此处
  9. 9. 8、info:正在执行的语句,如果没有语句则为空。语句可能是发送的服务端的,或一个内部语句(如果一个语句执行其他语句)例如:call调用一个(select语句)存储过程,info值会显示select语句。
  10. 10. 9、另外使用mysqladmin processlist也可以查看进程信息,如下图所示:
  11. 11. 10、如果想通过sql命令去获取自己设定的行,可按以下方法设置:

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog