MySQL SHOW PROCESSLIST输出详解

Share on:
mysql> SHOW FULL PROCESSLIST;
+----+------+-----------+------+---------+------+-------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+-----------------------+
| 65 | root | localhost | NULL | Query | 0 | NULL | SHOW FULL PROCESSLIST |
+----+------+-----------+------+---------+------+-------+-----------------------+
1 row in set (0.00 sec)

  • id
    连接标识符。这是跟INFORMATION_SCHEMA.PROCESSLIST表的ID列中显示相同的值,即Performance_Schema.threads的PROCESSLIST_ID列,并由CONNECTION_ID函数返回。
  • User
    发出语句的MySQL用户。如果这是system user,则它是指MYSQL服务器产生的非客户端线程,以在内部处理任务。这可能是复制从站或延迟行处理程序使用的I / O或SQL线程。unauthenticated user指的是已经与客户端连接关联但是尚未完成客户端用户的身份验证的线程。event_scheduler是指监视预定事件的线程。对于system user,在主机列中没有指定主机。
  • Host
    发出该语句的客户端的主机名(除了没有主机的system user除外)。SHOW PROCESSLIST报告host_name中的TCP / IP连接的主机名称:client_port格式,以便更容易地确定哪个客户端正在做什么。
  • db
    默认数据库,如果选择了一个,否则为NULL。
  • Command
    线程正在执行的命令类型。
<th>
  说明
</th>
<td>
  这是主服务器上的线程,用于将二进制日志内容发送到从属服务器。
</td>
<td>
  线程正在执行改变用户操作。
</td>
<td>
  线程正在关闭准备好的语句。
</td>
<td>
  复制从库连接到其主库。
</td>
<td>
  复制从库正在连接到其主库。
</td>
<td>
  线程正在执行create-database操作。
</td>
<td>
  此线程在服务器内部,而不是服务客户端连接的线程。
</td>
<td>
  线程正在生成调试信息。
</td>
<td>
  线程是一个延迟插入处理程序。
</td>
<td>
  线程正在执行drop-database操作。
</td>
<td>
  线程正在生成调试信息。
</td>
<td>
</td>
<td>
  线程正在执行一个准备好的语句。
</td>
<td>
  线程正在获取一个准备语句的结果。
</td>
<td>
  线程正在检索表列的信息。
</td>
<td>
  线程正在选择默认数据库。
</td>
<td>
  线程正在杀死另一个线程。
</td>
<td>
  该线程在执行一个准备语句的结果中检索长数据。
</td>
<td>
  线程正在处理服务器ping请求。
</td>
<td>
  线程正在准备一个准备好的语句。
</td>
<td>
  线程正在处理服务器ping请求。
</td>
<td>
  该线程正在执行一个语句。
</td>
<td>
  线程正在终止。
</td>
<td>
  线程是刷新表,日志或缓存,或重置状态变量或复制服务器信息。
</td>
<td>
  线程正在注册从服务器。
</td>
<td>
  线程正在重置一个准备好的语句。
</td>
<td>
  线程正在设置或重置客户端语句执行选项。
</td>
<td>
  线程正在关闭服务器。
</td>
<td>
  线程正在等待客户端向其发送新的语句。
</td>
<td>
  线程正在生成服务器状态信息。
</td>
<td>
  线程将表内容发送到从属服务器。
</td>
<td>
  Unused。
</td>

上述只是一部分,此列的值对应于客户端/服务器协议和Com_xxx状态变量的COM_xxx命令。https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html

  • Time
    线程已处于当前状态的时间(秒)。对于从库SQL线程,该值是上次复制事件的时间戳与从机实时的秒数。
  • State
    指示线程正在做什么的动作,事件或状态。
    大多数状态对应于非常快速的操作。如果线程在给定状态下保持多秒,则可能存在需要调查的问题。
<th>
  说明
</th>
<td>
  线程正在执行表检查操作。
</td>
<td>
  线程将更改的表数据刷新到磁盘并关闭已用表。这应该是一个快速的操作。如果没有,请验证您是否没有完整的磁盘,并且磁盘没有被非常大的使用。
</td>
<td>
  线程正在处理ALTER TABLE语句。此状态发生在已创建新结构的表之后,但是将行复制到该表之前。
</td>
<td>
  如果一条语句具有不同的ORDER BY和GROUP BY条件,则按行分组并将其复制到临时表中。
</td>
<td>
  服务器正在复制到内存中的临时表。
</td>
<td>
  服务器正在复制到磁盘上的临时表。临时结果集已经变得太大了(大于tmp_table_size)。因此,线程将临时表从内存中更改为基于磁盘的格式以节省内存。
</td>
<td>
  线程正在内存或磁盘上创建临时表。如果表在内存中创建,但后来转换为磁盘表,则该操作期间的状态将变为Copying to tmp table on disk。
</td>
<td>
  服务器正在执行多表删除的第一部分。它仅从第一个表中删除,并从其他(引用)表中保存要用于删除的列和偏移量。
</td>
<td>
  服务器正在执行多表删除的第二部分,并从其他表中删除匹配的行。
</td>
<td>
  这发生在ALTER TABLE,DELETE,INSERT,SELECT或UPDATE语句的初始化之前。处于此状态的服务器采取的操作包括刷新二进制日志,InnoDB日志和一些查询缓存清理操作。
</td>
<td>
  有人向线程发送了KILL语句,下次检查kill标志时应该中止它。在MySQL的每个主循环中检查该标志,但在某些情况下,线程可能需要很短时间才能死机。如果线程被某个其他线程锁定,则一旦其他线程释放锁定,该kill就会生效。
</td>
<td>
  服务器正在准备执行自然语言全文搜索。
</td>
<td>
  该查询被其它查询锁定。
</td>
<td>
  线程正在读取和处理SELECT语句的行,并向客户端发送数据。由于在此状态期间发生的操作往往执行大量的磁盘访问(读取),所以在给定查询的整个生命周期内通常是最长的运行状态。
</td>
<td>
  线程正在做一个满足GROUP BY的排序。
</td>
<td>
  线程正在做一个排序来满足ORDER BY。
</td>
<td>
  线程正在尝试打开一个表。这应该是非常快的程序,除非有事情阻止打开。例如,ALTER TABLE或LOCK TABLE语句可以阻止打开表,直到语句完成。还要检查你的table_open_cache值是否足够大。
</td>
<td>
  查询正在使用SELECT DISTINCT。使用时,在早期阶段,MySQL不能优化不同的操作。因此,MySQL要求一个额外的阶段,以便在把结果发送给客户端之前取消所有的复制行。
</td>
<td>
  线程得到一个表锁定,但是在得到锁定后被通知带下方的表结构已更改了。它已经释放了锁定,关闭了表,并试图重新打开它。
</td>
<td>
  线程正在进行第一阶段,以在更新之前,查找所有匹配的行。如果UPDATE正在更改用于查找相关行的索引,则必须这么做。
</td>
<td>
    线程正在等待客户端,以向它发送一个新语句。
</td>
<td>
  线程已经调用了mysql_lock_tables(),线程状态从未更新。这是一个非常普遍的状态,可能由于许多原因而发生。例如,线程将要求或正在等待表的内部或外部系统锁定。当InnoDB在执行LOCK TABLES期间等待表级锁时,可能会发生这种情况。如果此状态是由外部锁的请求引起的,并且您没有使用正在访问相同MyISAM表的多个mysqld服务器,则可以使用&#8211;skip-external-locking选项禁用外部系统锁。但是,默认情况下禁用外部锁定,因此这个选项很有可能不起作用。对于SHOW PROFILE,此状态表示线程正在请求锁定(不等待)。
</td>
<td>
  INSERT DELAYED管理程序正在试图得到一个表锁定,以插入行。
</td>
<td>
  线程正在搜索行,并正在更新这些行。
</td>
<td>
  线程正在等待GET_LOCK()。
</td>
<td>
  线程得到一个通知,表格的底层结构已经改变,需要重新打开表以获得新的结构。但是,要重新打开表格,必须等到所有其他线程都关闭该表。如果另一个线程在相关表中使用FLUSH TABLES或以下语句之一,则会发生此通知:FLUSH TABLES tbl_name,ALTER TABLE,RENAME TABLE,REPAIR TABLE,ANALYZE TABLE或OPTIMIZE TABLE。
</td>
<td>
   INSERT DELAYED管理程序已经处理了所有处于等待状态的插入,并正在等待新插入。
</td>
<td>
  https://dev.mysql.com/doc/refman/5.7/en/thread-information.html
</td>
  • Info
    线程正在执行的语句,如果没有执行任何语句,则为NULL。该语句可能是发送到服务器的语句,也可能是语句执行其他语句时的内部语句。例如,如果CALL语句执行执行SELECT语句的存储过程,则Info值将显示SELECT语句。

参考
https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html
https://dev.mysql.com/doc/refman/5.7/en/thread-information.html
https://dev.mysql.com/doc/refman/5.7/en/thread-commands.html
https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html

闽ICP备12003472号-7