原文档参见:show processlist 官方文档

show processlist 命令返回的数据会展示给你正在运行的进程。你也可以从INFOMATION_SCHEMA的processlist表中获取这些数据,还可以通过mysqldadmin processlist命令行获取。如果你有进程权限,则可以查看所有的进程。否则你只能看你自己的进程(意思就是,只能看到和你登录mysql账户相关的进程)。如果没有使用full关键字,只会返回前100条进程信息。

进程信息也可以通过performance_schema的threads表获取。但是访问threads表不需要一个互斥锁,对服务器的印象也会很小。通过information.processlist和show processlist 会差生负面的性能影响,因为他们需要一个互斥锁。threads表还会展示一些后台进程的信息,而另外两种方式没有。这就一位置threads表可以用来监控其他信息源不能监控的活动。

show processlist 语句非常用用,如果你发现“too many connections”错误信息,并且想查明正在进行的线程,MySQL保留一个额外的连接,供具有超级特权的账户使用,以确保管理员始终能够连接和检查系统(假设您没有将此特权授予所有用户)。

线程可以使用kill语句被杀死。

下面是一些show 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. row ***************************
Id: 3112
User: replikator
Host: artemis:2204
db: NULL
Command: Binlog Dump
Time: 2144
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 4. row ***************************
Id: 3113
User: replikator
Host: iconnect2:45781
db: NULL
Command: Binlog Dump
Time: 2086
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 5. row ***************************
Id: 3123
User: stefan
Host: localhost
db: apollon
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
5 rows in set (0.00 sec)

show processlist返回的列有以下含义

  • Id 连接的唯一标识符。这个值和information_schema.processlist表中的ID,threads表中的processlist_id,connection_id()函数返回值是一样的。可以通过kill Id删除这个连接进程。
  • User  执行语句的mysql用户。如果这是系统用户,它指的是由服务器产生的非客户端线程来处理内部任务。这可能是用于从库复制或延迟行处理程序的输入/输出或SQL线程。未经身份验证的用户指的是与客户端连接相关联的线程,但是客户端用户的身份验证尚未完成。events_cheduler是指监视预定事件的线程。对于系统用户,主机列中没有指定主机。
  • Host 发出语句的客户端名称(除了没有主机的系统用户之外)。SHOW PROCESSLIST报告主机名的主机名:client:port格式,以便更容易地确定哪个客户端正在做什么。
  • db    执行sql的数据库
  • Command 正在执行线程命令的类型,本文主要详解这个信息。
  • Time  线程已经在当前状态下的时间,单位为S。
  • State  一种表示线程正在做什么的动作、事件或状态。大多数状态对应于非常快速的操作。如果一个线程在一个给定的状态下停留了许多秒,那么可能会有一个问题需要被调查。对于 show processlist这个语句来说,状态为null。
  • Info 线程正在运行的sql语句,或者什么也没有运行的话则为null。sql语句可能是发送到服务器的那个语句,或者是一个最内部的语句,如果语句执行其他语句。比如比如调用一个调用select语句的存储过程,info的值为为这个select语句。

下面对command的各种值做一个解释:

command值

解释

Binlog Dump

这是主服务器上的一个线程,用于向从属服务器发送二进制日志内容。

Change user

线程正在执行一个变更用户操作。

Close stmt

线程正在关闭一个准备好的语句。

Connect

一个复制从属mysql连接上了他的主数据库

Connect Out

一个复制从属mysql正在连接他的主数据库

Create DB

线程在执行一个建数据库操作

Daemon

这个线程是服务器内部的,而不是服务于客户端连接的线程。

Debug

线程正在生成调试信息。

Delayed insert

线程是一个延迟插入处理程序。

Drop DB

线程在执行删库操作

Error

线程发生错误

Execute

线程正在执行一个准备好的语句。

Fetch

线程正在从执行准备好的语句中获取结果。

Field List

线程正在检索表列的信息。

Init DB

线程正在选择一个默认数据库。

Kill

这个线程正在杀死另一个线程。

Long Data

线程在执行准备好的语句的结果中检索长数据。

Ping

线程正在处理一个服务器ping请求。

Prepare

线程正在准备一个准备好的语句。

Processlist

线程正在生成关于服务器线程的信息

Query

线程正在执行一条语句。

Quit

线程终止。

Refresh

线程在刷新表、日志或缓存,或者重置状态变量或复制服务器信息。

Register Slave

线程正在注册一个从属服务器。

Reset stmt

线程正在重置准备好的语句。

Set option

线程正在设定或重置客户端状态执行选项。

shutdown

线程正在关闭服务器。

Sleep

线程正在等待客户端向它发送一个新的语句。

Statistics

线程正在生成服务器状态信息。

Table Dump

线程正在向从属服务器发送表内容。

Time

从未用过



下面对status关键字做一个简介:

下面的列表描述了与一般查询处理相关联的线程状态值,像主从复制这样的更专业的活动非。其中许多功能只适用于在服务器中查找bug。

state值

解释

After create

当线程创建一个表(包括内部临时表)时,就会发生这种情况,在创建表的函数的末尾处。即使由于某些错误而不能创建表,也会使用这个状态。

Analyzing

线程正在计算MyISAM表键的分布(例如,用于分析表)

checking permissions

线程正在检查服务器是否拥有执行语句所需的特权。

Checking table

线程正在执行一个表格检查操作。

cleaning up

线程已经处理了一个命令,并且正在准备释放内存和重置某些状态变量。

closing tables

线程将更改的表数据刷新到磁盘,并关闭已使用的表。这应该是一个快速的操作。如果没有,请确认您没有一个完整的磁盘,并且磁盘没有很重的使用。

converting HEAP to ondisk

线程正在将一个内部临时表从一个存储器表转换成一个磁盘表。

copy to tmp table

线程正在处理ALTER TABLE语句。这个状态发生在表之后,新的结构已经被创建,但是在行被复制到表之前。


对于处于这个状态的线程来说,Performance Schema可以用来获得复制操作的进度。

Copying to group table

如果一个语句按照标准按不同的顺序排列,那么各行将按组排序并复制到一个临时表中。

Copying to tmp table

服务器正在复制到内存中的临时表。

altering table

服务器正在执行一个原位的ALTER TABLE。

Copying to tmp table on disk

服务器正在复制到磁盘上的临时表。临时结果集变得太大了。因此,线程正在将临时表从内存中更改为基于磁盘的格式,以节省内存。

Creating index

线程正在处理ALTER TABLE……启用MyISAM表的键。

Creating sort index

线程正在处理使用内部临时表解析的SELECT。

creating table

线程正在创建一个表。这包括创建临时表。


Creating tmp table

线程正在内存或磁盘上创建一个临时表。如果表是在内存中创建的,但是后来被转换成一个磁盘表,那么该操作期间的状态将会复制到磁盘上的tmp表。

committing alter table to storage engine

服务器已经完成了一个就地修改表,并正在提交结果。

deleting from main table

服务器正在执行一个多表删除的第一部分。它只从第一个表中删除,并保存列和偏移量,以便从其他(参考)表中删除。

deleting from reference tables

服务器正在执行多表删除的第二部分,并从其他表中删除匹配的行。

discard_or_import_tablespace

线程正在处理一个ALTER TABLE……丢弃表空间或ALTER TABLE……导入表空间中。

end

这发生在最后,但是在ALTER TABLE,创建视图、删除、插入、选择或更新语句清理之前。

executing

线程已经开始执行一个语句。

Execution of init_command

线程在init_command系统变量的值中执行语句。

freeing items

线程已经执行了一个命令。在这个状态下完成的一些物品的释放涉及到查询缓存。通常情况下,这个状态会被清理

FULLTEXT initialization

服务器正准备执行自然语言全文搜索。

init

这发生在ALTER TABLE的初始化之前,删除,插入,选择,或更新语句。服务器在这个状态下所采取的操作包括冲洗二进制日志、InnoDB日志和一些查询缓存清理操作。对于end状态,以下操作可能会发生:

1.在表格中的数据被更改后删除查询缓存条目

2.将事件写入二进制日志

3.释放内存缓冲区,包括blob

Killed

有人给线程发送了一个KILL语句,它应该在下一次检查KILL标志时终止。在MySQL的每个主要循环中都要检查国旗,但在某些情况下,线程可能需要很短的时间才能死。如果线程被其他线程锁定,那么当其他线程释放锁时,kill就会生效。

logging slow query

线程正在为慢查询日志写一个语句。

login

连接线程的初始状态,直到客户端成功验证为止。

manage keys

服务器启用或禁用表索引。

NULL

z这个状态被用于SHOW PROCESSLIST状态。

opening tables

线程正在尝试打开一个表。这应该是非常快的过程,除非有什么东西阻止打开。例如,ALTER TABLE或锁表语句可以防止在语句完成之前打开表。同样需要检查的是,您的table_open_cache值足够大。

optimizing

服务器正在为一个查询执行初始优化

preparing

这种状态发生在查询优化期间

Purging old relay logs

线程正在删除不需要的中继日志文件

query end

这个状态发生在处理一个查询之后,但是在释放项状态之前。

Receiving from client

服务器正在读取客户端的数据包。这个状态被称为在MySQL 5.7.8之前的网络读取。

Removing duplicates

该查询使用SELECT截然不同的方式,MySQL无法在早期阶段优化不同的操作。因此,MySQL需要一个额外的阶段来删除所有重复的行,然后将结果发送给客户端。

removing tmp table

线程在处理一个SELECT语句后删除一个内部临时表。如果没有创建临时表,则不使用此状态

rename

线程正在重命名一个表。

rename result table

线程正在处理ALTER TABLE语句,创建了新表,并重新命名它来替换原来的表

Reopen tables

线程为表获得了一个锁,但是在获得了底层表结构更改后的锁之后才注意到。它释放了锁,关闭了表,并试图重新打开它

Repair by sorting

修复代码使用某种类型来创建索引。

preparing for alter table

服务器正在准备执行一个就地修改表。

Repair done

线程已经完成了一个MyISAM表的多线程修复。

Repair with keycache

修复代码使用一个接一个地通过密钥缓存创建密钥。这比通过排序要慢得多。

Rolling back

线程正在回滚事务。

Saving state

对于MyISAM表操作,如修复或分析,线程正在将新表状态保存到.MYI文件头。状态包含诸如行数、自动递增计数器和键分布等信息

Searching rows for update

线程正在做第一个阶段,在更新它们之前找到所有匹配的行。如果更新正在改变用于查找所涉及行的索引,那么就必须这样做

Sending data

线程正在读取和处理SELECT语句的行,并将数据发送给客户机。因为在这个状态中发生的操作倾向于执行大量的磁盘访问(读取),所以它通常是给定查询的生命周期中最长的运行状态。

Sending to client

服务器正在给客户端写一个数据包。

setup

线程正在开始一个ALTER TABLE操作。

Sorting for group

 线程在做一个排序去优化group by操作

Sorting for order

 线程在做一个排序去优化order操作

Sorting index

在MyISAM表优化操作期间,线程正在对索引页进行排序,以获得更高效的访问。

Sorting result

对于SELECT语句,这类似于创建排序索引,但只是对于非临时表来说。

statistics

服务器正在计算统计信息以开发一个查询执行计划。如果一个线程在这个状态中存在很长一段时间,那么服务器可能会执行其他工作。

System lock

mysql_lock_tables(),并且线程状态还没有被更新。这是一个非常普遍的状态,可能有很多原因。例如,线程将请求或正在等待表的内部或外部系统锁定。当InnoDB在执行锁表时等待表级锁时,就会发生这种情况。如果这个状态是由外部锁的请求引起的,并且您没有使用多个mysqld服务器访问相同的MyISAM表,那么您可以使用-skip-external锁定选项禁用外部系统锁。然而,外部锁定在缺省情况下是禁用的,因此该选项很可能不会产生任何影响。对于SHOW PROFILE,这个状态意味着螺纹请求锁(而不是等待它)。

update

线程正在准备开始更新表。

Updating

线程正在搜索要更新的行,并正在更新它们。

updating main table

服务器正在执行多表更新的第一部分。它只更新第一张表,并保存列和偏移量,用于更新其他(参考)表。

updating reference tables

服务器正在执行一个多表更新的第二部分,并更新来自其他表的匹配行。

User lock

线程会请求或正在等待一个带有getlock()调用的咨询锁。对于SHOW PROFILE,这个状态意味着线程请求锁(而不是等待它)。

User sleep

线程调用了SLEEP()调用。

Waiting for commit lock

FLUSH TABLES WITH READ LOCK 等待一个提交锁

Waiting for global read lock

FLUSH TABLES WITH READ LOCK 正在等待全局读锁,或者正在设置全局readonly系统变量。

Waiting for tables




该线程得到了一个通知,表明表的底层结构已经发生了变化,它需要重新打开表来获得新的结构。但是,要重新打开表,它必须等到所有其他线程都关闭了这个表。


如果另一个线程使用了刷新表或下面的表中的一个语句:刷新表tblname、ALTER TABLE、RENAME表、修理表、分析表或优化表,则会发出通知。

Waiting for table flush

线程正在执行冲刷的表,并等待所有线程关闭它们的表,或者线程得到通知,表的底层结构发生了变化,它需要重新打开表格以获得新的结构。但是,要重新打开表,它必须等到所有其他线程都关闭了这个表。


如果另一个线程使用了冲刷表或下面的表中的一个语句:刷新表tblname、ALTER TABLE、RENAME表、修理表、分析表或优化表,则会发出通知。

Waiting for lock_type lock

服务器正在等待从元数据锁定子系统获得一个THR_LOCL锁或锁,其中locktype表示锁的类型。


这个状态表示等待一个THR_LOCK锁:

Waiting for table level lock

这些状态表示等待元数据锁:


  • Waiting for event metadata lock
  • Waiting for global read lock
  • Waiting for schema metadata lock
  • Waiting for stored function metadata lock
  • Waiting for stored procedure metadata lock
  • Waiting for table metadata lock
  • Waiting for trigger metadata lock