Skip to main content

general_thread_states

以下列表描述了与一般查询处理关联的线程状态值,而不是与复制等更专门的活动关联的线程状态值。 其中许多仅用于查找服务器中的错误。

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

  • altering table 服务器正在执行就地 ALTER TABLE。

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

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

  • Checking table 该线程正在执行表检查操作。

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

  • closing tables 该线程将更改的表数据刷新到磁盘并关闭已使用的表。 这应该是一个快速的操作。 如果不是,请验证您的磁盘是否已满,并且该磁盘的使用率不是很高。

  • committing alter table to storage engine 服务器已完成就地 ALTER TABLE 并正在提交结果。

  • converting HEAP to ondisk 该线程正在将内部临时表从 MEMORY 表转换为磁盘表。

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

    对于处于这种状态的线程,可以使用Performance Schema来获取有关复制操作的进度。

  • Copying to group table 如果语句具有不同的 ORDER BY 和 GROUP BY 标准,则行将按组排序并复制到临时表。

  • Copying to tmp table 服务器正在复制到内存中的临时表。

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

  • Creating index 该线程正在处理 MyISAM 表的 ALTER TABLE ... ENABLE KEYS。

  • Creating sort index 该线程正在处理使用内部临时表解析的 SELECT。

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

  • Creating tmp table 该线程正在内存或磁盘上创建临时表。 如果该表是在内存中创建的,但后来转换为磁盘上的表,则该操作期间的状态为“正在复制到磁盘上的临时表”。

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

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

  • discard_or_import_tablespace 该线程正在处理 ALTER TABLE ... DISCARD TABLESPACE 或 ALTER TABLE ... IMPORT TABLESPACE 语句。

  • end 这发生在最后但在 ALTER TABLE、CREATE VIEW、DELETE、INSERT、SELECT 或 UPDATE 语句清理之前。

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

    • 将事件写入二进制日志
    • 释放内存缓冲区,包括 blob
  • executing 线程已开始执行一条语句。

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

  • freeing items 线程已执行命令。 这种状态之后通常会进行清理。

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

  • init 这发生在初始化 ALTER TABLE、DELETE、INSERT、SELECT 或 UPDATE 语句之前。 在此状态下服务器采取的操作包括刷新二进制日志和InnoDB日志。

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

  • Locking system tables 该线程正在尝试锁定系统表(例如,时区或日志表)。

  • logging slow query 该线程正在向慢查询日志写入一条语句。

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

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

  • Opening system tables 该线程正在尝试打开系统表(例如,时区或日志表)。

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

    对于系统表,则使用打开系统表状态。

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

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

  • preparing for alter table 服务器正准备执行就地 ALTER TABLE。

  • Purging old relay logs 该线程正在删除不需要的中继日志文件。

  • query end 此状态发生在处理查询之后、释放项目状态之前。

  • Receiving from client 服务器正在从客户端读取数据包。

  • 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 修复代码是通过键缓存一一创建键。 这比通过排序修复慢得多。

  • Rolling back 线程正在回滚事务。

  • Saving state 对于 MyISAM 表操作(例如修复或分析),线程会将新表状态保存到 .MYI 文件头。 状态包括行数、AUTO_INCRMENT 计数器和键分布等信息。

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

  • Sending data 此状态现在包含在 Executing 状态中。

  • Sending to client 服务器正在向客户端写入数据包。

  • setup 该线程正在开始 ALTER TABLE 操作。

  • Sorting for group 该线程正在执行排序以满足 GROUP BY。

  • Sorting for order 该线程正在执行排序以满足 ORDER BY。

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

  • Sorting result 对于 SELECT 语句,这类似于创建排序索引,但对于非临时表。

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

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

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

    例如,线程将请求或正在等待表的内部或外部系统锁。 当 InnoDB 在执行 LOCK TABLES 期间等待表级锁时,可能会发生这种情况。 如果这种状态是由外部锁请求引起的,并且您没有使用多个访问相同 MyISAM 表的 mysqld 服务器,则可以使用 --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 handler commit 与查询处理的其他部分相比,线程正在等待事务提交。

  • Waiting for tables 线程收到通知,表的底层结构已更改,需要重新打开表才能获取新结构。 但是,要重新打开该表,必须等到所有其他线程都关闭了相关表。 如果另一个线程对相关表使用了 FLUSH TABLES 或以下语句之一,则会发生此通知:FLUSH TABLES tbl_name、ALTER TABLE、RENAME TABLE、REPAIR TABLE、ANALYZE TABLE 或 OPTIMIZE TABLE。

  • Waiting for table flush 线程正在执行 FLUSH TABLES 并等待所有线程关闭其表,或者线程收到表的底层结构已更改且需要重新打开表以获取新结构的通知。 但是,要重新打开该表,必须等到所有其他线程都关闭了相关表。 如果另一个线程对相关表使用了 FLUSH TABLES 或以下语句之一,则会发生此通知:FLUSH TABLES tbl_name、ALTER TABLE、RENAME TABLE、REPAIR TABLE、ANALYZE TABLE 或 OPTIMIZE TABLE。

  • Waiting for lock_type lock 服务器正在等待获取 THR_LOCK 锁或来自元数据锁定子系统的锁,其中 lock_type 表示锁的类型。 该状态表示等待 THR_LOCK:

    • 等待表级锁

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

    • 等待事件元数据锁定
    • 等待全局读锁
    • 等待架构元数据锁
    • 等待存储的函数元数据锁
    • 等待存储过程元数据锁
    • 等待表元数据锁
    • 等待触发元数据锁
  • Waiting on cond 线程正在等待条件变为真的通用状态。 没有具体的状态信息。

  • Writing to net 服务器正在向网络写入数据包。