show processlist

简介

show processlist是显示用户正在运行的线程,需要注意的是,出了root用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程.除非单独这个用户赋予了process权限.

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

select * from information_schema.processlist

我们看看查询出来的结果都是什么意思

结果

  • id:这个线程的唯一标识,当发现这个线程有问题的时候,可以用kill 命令,加上这个线程ID值将这个线程杀掉,前面我们说了show processlist 显示的信息时来自information_schema.processlist 表,所以这个Id就是这个表的主键。
  • user就是启动这个线程的用户
  • host记录了发送请求的客户端的up和端口号.通过这些信息在排查问题的时候,我们可以定位到是哪个客户端的那个进程发送的请求
  • DB:当前执行的命令是在哪一个数据库上.如果没有指定数据库,则该值为null
  • command是指刺客该线程正在执行的命令,.这个很复杂下面单独解释
  • time:表示该线程处于当前状态的时间.
  • state:线程的状态,和command对应.下面1单独解释
  • info一般记录的是线程的执行的语句.默认只显示前100个字符,也就是看到的语句很可能是截断了的,要看全部信息,需要使用show full processlist

来单独看一下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

state的值

以下引用自官方文档

  • After create

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

  • altering table

服务器正在执行就地服务 ALTER TABLE

  • Analyzing

线程正在计算MyISAM表键分布(例如for ANALYZE TABLE)。

  • checking permissions

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

  • Checking table

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

  • cleaning up

该线程已处理了一条命令,并准备释放内存并重置某些状态变量。

  • closing tables

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

  • committing alter table to storage engine

服务器已就地完成 ALTER TABLE并提交结果。

  • converting HEAP to MyISAM

线程正在将内部临时表从 MEMORY表转换为磁盘 MyISAM表。

  • copy to tmp table

线程正在处理一条ALTER TABLE语句。在创建具有新结构的表之后但在将行复制到其中之前,将发生此状态。

  • Copying to group table

如果语句具有不同的条件ORDER BYGROUP BY条件,则按组对行进行排序并将其复制到临时表中。

  • Copying to tmp table

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

  • Copying to tmp table on disk

服务器正在复制到磁盘上的临时表。临时结果集太大(请参见 第8.4.4节“ MySQL中的内部临时表使用”)。因此,线程正在将临时表从内存格式更改为基于磁盘的格式,以节省内存。

  • Creating index

线程正在处理ALTER TABLE ... ENABLE KEYS一个MyISAM表。

  • Creating sort index

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

  • creating table

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

  • Creating tmp table

该线程正在内存或磁盘上创建一个临时表。如果该表是在内存中创建的,但后来又转换为磁盘表,则该操作期间的状态将为Copying to tmp table on disk

  • deleting from main table

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

  • deleting from reference tables

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

  • discard_or_import_tablespace

线程正在处理ALTER TABLE ... DISCARD TABLESPACEor ALTER TABLE ... IMPORT TABLESPACE语句。

  • end

这发生在结束,但的清理之前 ALTER TABLECREATE VIEWDELETEINSERTSELECT,或 UPDATE语句。

  • executing

该线程已开始执行一条语句。

  • Execution of init_command

线程正在使用init_command系统变量的值执行语句 。

  • freeing items

线程已执行命令。在此状态下完成的某些项目释放涉及查询缓存。此状态通常后跟cleaning up

  • FULLTEXT initialization

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

  • init

出现这种情况的初始化之前 ALTER TABLEDELETEINSERTSELECT,或 UPDATE语句。服务器在此状态下采取的操作包括刷新二进制日志,InnoDB日志和一些查询缓存清除操作。

对于end状态,可能发生以下操作:

    • 更改表中的数据后删除查询缓存条目
    • 将事件写入二进制日志
    • 释放内存缓冲区,包括用于blob的缓冲区
    • Killed

    有人KILL 向该线程发送了一条语句,下次检查kill标志时,它将中止。在MySQL的每个主循环中都会检查该标志,但是在某些情况下,线程死亡仍然可能需要很短的时间。如果该线程被其他某个线程锁定,则杀死操作将在另一个线程释放其锁定后立即生效。

    • logging slow query

    线程正在将一条语句写入慢速查询日志。

    • login

    连接线程的初始状态,直到客户端已成功通过身份验证。

    • manage keys

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

    • NULL

    该状态用于SHOW PROCESSLIST状态。

    • Opening tables

    线程正在尝试打开表。除非有什么阻止打开的步骤,否则这应该是非常快速的过程。例如,一个ALTER TABLE或一条 LOCK TABLE语句可以阻止在该语句完成之前打开表。还值得检查您的table_open_cache价值是否足够大。

    • optimizing

    服务器正在对查询执行初始优化。

    • preparing

    此状态在查询优化期间发生。

    • preparing for alter table

    服务器正在准备执行就地 ALTER TABLE

    • Purging old relay logs

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

    • query end

    此状态在处理查询之后但在该freeing items状态之前发生 。

    • Reading from net

    服务器正在从网络读取数据包。

    • Removing duplicates

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

    • removing tmp table

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

    • rename

    线程正在重命名表。

    • rename result table

    该线程正在处理一条ALTER TABLE语句,创建了新表,并对其进行了重命名以替换原始表。

    • Reopen tables

    线程获得了该表的锁,但是在获得该锁后,该线程注意到基础表结构已更改。它释放了锁,关闭了表,并试图重新打开它。

    • Repair by sorting

    修复代码正在使用某种排序来创建索引。

    • Repair done

    该线程已完成对MyISAM表的多线程修复 。

    • Repair with keycache

    修复代码正在通过密钥缓存一一创建密钥。这比慢得多Repair by sorting

    • Rolling back

    线程正在回滚事务。

    • Saving state

    对于MyISAM表操作(例如修复或分析),线程会将新表状态保存到.MYI文件头。状态包括诸如行数, AUTO_INCREMENT计数器和密钥分布之类的信息。

    • Searching rows for update

    线程正在执行第一阶段以在更新所有匹配的行之前找到它们。如果 UPDATE更改了用于查找所涉及行的索引,则必须执行此操作。

    • Sending data

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

    • setup

    线程正在开始ALTER TABLE操作。

    • Sorting for group

    线程正在做某种排序以满足GROUP BY

    • Sorting for order

    线程正在做某种排序以满足ORDER BY

    • Sorting index

    该线程正在对索引页进行排序,以在MyISAM表优化操作期间更有效地进行访问。

    • Sorting result

    对于SELECT语句,这类似于Creating sort index,但是对于非临时表。

    • statistics

    服务器正在计算统计信息以制定查询执行计划。如果线程长时间处于此状态,则服务器可能是磁盘绑定的,正在执行其他工作。

    • System lock

    从此线程已被调用mysql_lock_tables() ,并且线程状态尚未更新。这是一种非常普遍的状态,可能由于多种原因而发生。

    例如,线程将要请求或正在等待表的内部或外部系统锁定。当InnoDB执行时等待表级锁定时, 可能会发生这种情况LOCK TABLES。如果此状态是由对外部锁的请求引起的,并且您没有使用正在访问同一 表的多个mysqld服务器,则MyISAM可以使用该--skip-external-locking 选项禁用外部系统锁 。但是,默认情况下将禁用外部锁定,因此此选项可能无效。对于 SHOW PROFILE,此状态表示线程正在请求锁定(不等待它)。

    • update

    线程已准备好开始更新表。

    • Updating

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

    • updating main table

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

    • updating reference tables

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

    • User lock

    该线程将要请求或正在等待通过GET_LOCK()调用请求的咨询锁定 。对于 SHOW PROFILE,此状态表示线程正在请求锁定(不等待它)。

    • User sleep

    线程已调用 SLEEP()

    • Waiting for commit lock

    FLUSH TABLES WITH READ LOCK 正在等待提交锁。

    • Waiting for global read lock

    FLUSH TABLES WITH READ LOCK 正在等待全局读取锁定或read_only正在设置全局 系统变量。

    • Waiting for tables

    该线程收到通知,表明表的基础结构已更改,因此需要重新打开表以获取新结构。但是,要重新打开该表,它必须等待,直到所有其他线程关闭了该表为止。

    这张告示,如果另一个线程使用的地方 FLUSH TABLES或有问题的表下面的语句之一: , , , , ,或 。 FLUSH TABLES *tbl_name*ALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE

    • Waiting for table flush

    该线程正在执行FLUSH TABLES并正在等待所有线程关闭其表,或者该线程收到有关表的基础结构已更改的通知,并且需要重新打开表以获取新结构。但是,要重新打开该表,它必须等待,直到所有其他线程关闭了该表为止。

    这张告示,如果另一个线程使用的地方 FLUSH TABLES或有问题的表下面的语句之一: , , , , ,或 。 FLUSH TABLES *tbl_name*ALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE

    • Waiting for *lock_type* lock

    服务器正在等待THR_LOCK从元数据锁定子系统获取 锁或锁,其中 lock_type指示了锁的类型。

    此状态表示正在等待 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

    有关表锁定指示器的信息,请参见 第8.11.1节“内部锁定方法”。有关元数据锁定的信息,请参见第8.11.4节“元数据锁定”

    • Waiting on cond

    线程正在等待条件变为真的一般状态。没有可用的特定状态信息。

    • Writing to net

    服务器正在将数据包写入网络。

    Last modification:November 17, 2023
    如果觉得我的文章对你有用,请随意赞赏