8.14.3 通用线程状态

下 table 描述了与常规查询处理相关的线程State值,而不是诸如复制之类的更专门的活动。其中许多仅用于发现服务器中的错误。

  • After create

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

  • altering table

服务器正在执行就地ALTER TABLE的过程。

  • Analyzing

该线程正在计算MyISAMtable 键分布(例如,对于ANALYZE TABLE)。

  • checking permissions

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

  • Checking table

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

  • cleaning up

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

  • closing tables

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

  • converting HEAP to ondisk

线程正在将内部临时 table 从MEMORYtable 转换为磁盘上 table。

  • copy to tmp table

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

对于处于这种状态的线程,可以使用性能架构来获取有关复制操作进度的信息。参见第 25.12.5 节“性能架构阶段事件 table”

  • Copying to group table

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

  • Copying to tmp table

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

  • Copying to tmp table on disk

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

  • Creating index

线程正在处理MyISAMtable 的ALTER TABLE ... ENABLE KEYS

  • Creating sort index

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

  • creating table

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

  • Creating tmp table

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

  • committing alter table to storage engine

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

  • deleting from main table

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

  • deleting from reference tables

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

  • discard_or_import_tablespace

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

  • end

这发生在最后但清除ALTER TABLECREATE VIEWDELETEINSERTSELECTUPDATE语句之前。

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

  • 更改 table 中的数据后删除查询缓存条目

    • 将事件写入二进制日志

    • 释放内存缓冲区,包括用于 blob 的缓冲区

  • executing

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

  • Execution of init_command

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

  • freeing items

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

  • FULLTEXT initialization

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

  • init

这发生在初始化ALTER TABLEDELETEINSERTSELECTUPDATE语句之前。服务器在此状态下采取的操作包括刷新二进制日志,InnoDB日志和一些查询缓存清除操作。

  • Killed

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

  • logging slow query

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

  • login

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

  • manage keys

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

  • Opening tables

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

  • optimizing

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

  • preparing

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

  • Purging old relay logs

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

  • query end

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

  • Receiving from client

服务器正在从 Client 端读取数据包。在 MySQL 5.7.8 之前,此状态称为Reading from net

  • Removing duplicates

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

  • removing tmp table

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

  • rename

线程正在重命名 table。

  • rename result table

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

  • Reopen tables

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

  • Repair by sorting

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

  • preparing for alter table

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

  • Repair done

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

  • Repair with keycache

修复代码使用的是通过密钥缓存一对一地创建密钥。这比Repair by sorting慢得多。

  • Rolling back

线程正在回滚事务。

  • Saving state

对于诸如修复或分析之类的MyISAMtable 操作,该线程将新 table 状态保存到.MYI文件头中。状态包括诸如行数,AUTO_INCREMENT计数器和键分布之类的信息。

  • Searching rows for update

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

  • Sending data

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

  • Sending to client

服务器正在将数据包写入 Client 端。在 MySQL 5.7.8 之前,此状态称为Writing to net

  • setup

线程正在开始ALTER TABLE操作。

  • Sorting for group

线程正在进行排序以满足GROUP BY

  • Sorting for order

该线程正在进行排序以满足ORDER BY

  • Sorting index

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

  • Sorting result

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

  • starting

语句执行开始的第一阶段。

  • statistics

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

  • System lock

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

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

  • update

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

  • Updating

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

  • updating main table

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

  • updating reference tables

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

  • User lock

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

  • User sleep

该线程已调用SLEEP()调用。

  • Waiting for commit lock

带读取锁的平桌子正在 await 提交锁。

  • Waiting for global read lock

带读取锁的平桌子正在 await 全局读取锁定,或者正在设置全局read_only系统变量。

  • Waiting for tables

该线程收到有关 table 的基础结构已更改的通知,它需要重新打开 table 以获取新的结构。但是,要重新打开该 table,它必须 await,直到所有其他线程关闭了该 table。

如果另一个线程在相关 table 上使用了FLUSH TABLES或以下语句之一,则会发生此通知:FLUSH TABLES tbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE

  • Waiting for table flush

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

如果另一个线程在相关 table 上使用了FLUSH TABLES或以下语句之一,则会发生此通知:FLUSH TABLES tbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE

  • Waiting for lock_type lock

服务器正在 await 从元数据锁定子系统获取THR_LOCK锁或锁,其中* lock_type *table 示锁的类型。

此状态 table 示正在 awaitTHR_LOCK

  • Waiting for table level lock

这些状态指示 await 元数据锁定:

  • 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

有关 table 锁定指示器的信息,请参见第 8.11.1 节“内部锁定方法”。有关元数据锁定的信息,请参见第 8.11.4 节“元数据锁定”。要查看哪些锁阻止了锁请求,请使用第 25.12.12 节,“性能模式锁定 table”中描述的性能架构锁 table。

  • Waiting on cond

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

  • Writing to net

服务器正在将数据包写入网络。从 MySQL 5.7.8 开始,此状态称为Sending to client