Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


10.14.3 一般线程状态

以下列表描述了与一般查询处理相关的线程State值,而不是更为特殊的活动,如复制。这些值中许多只有在服务器中找到bug时才有用。

  • After create

    线程在创建表(包括内部临时表)时结束函数的末尾,这个状态即使表不能被创建也会使用。

  • altering table

    服务器正在执行一个在-placeALTER TABLE语句。

  • Analyzing

    线程正在计算一个MyISAM表键分布(例如,用于ANALYZE TABLE语句)。

  • checking permissions

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

  • Checking table

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

  • cleaning up

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

  • closing tables

    线程正在将更改的表数据刷新到磁盘上,并关闭已使用的表。这个操作应该很快。如果不是,请验证您没有满磁盘,也没有磁盘非常繁忙。

  • committing alter table to storage engine

    服务器已经完成了在-placeALTER TABLE操作,并正在提交结果。

  • converting HEAP to ondisk

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

  • copy to tmp table

    线程正在处理ALTER TABLE语句。这一状态发生在创建了具有新结构的表但还没有将行复制到其中时。

    在该状态的线程中,可以使用性能_schema来获取复制操作的进度信息。请参阅第29.12.5节,“性能_schema阶段事件表”

  • Copying to group table

    如果语句具有不同的ORDER BYGROUP BY标准,行将根据组排序并复制到临时表中。

  • Copying to tmp table

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

  • Copying to tmp table on disk

    服务器正在将数据复制到磁盘上的临时表中。临时结果集已经变得太大(请参阅第10.4.4节,“MySQL内部临时表使用”),因此线程正在将临时表从内存中切换到磁盘格式以保存内存。

  • Creating index

    线程正在处理ALTER TABLE ... ENABLE KEYS语句对MyISAM表的操作。

  • Creating sort index

    线程正在处理一个SELECT语句,该语句使用内部临时表进行解析。

  • 创建表

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

  • 创建临时表

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

  • 从主表中删除

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

  • 从引用表中删除

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

  • discard_或_import_表空间

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

  • end

    ALTER TABLECREATE VIEWDELETEINSERTSELECTUPDATE语句执行完成,但在清理前。

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

    • 将事件写入二进制日志

    • 释放内存缓冲区,包括blob类型的缓冲区

  • executing

    线程已经开始执行语句。

  • Execution of init_command

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

  • freeing items

    线程已经执行了命令。这状态通常后面跟着cleaning up

  • 全文搜索初始化

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

  • init

    这发生在ALTER TABLEDELETEINSERTSELECTUPDATE语句之前。服务器在这个状态下执行的操作包括刷新二进制日志和InnoDB日志。

  • Killed

    有人发送了KILL语句到线程,它将在下一次检查杀死标志时中止。服务器每次进行主要循环都检查杀死标志,但是在某些情况下,线程可能还需要短暂时间才能死亡。如果线程被其他线程锁定,kill的效果将在其他线程释放其锁定后生效。

  • 锁定系统表

    线程尝试锁定系统表(例如时区或日志表)。

  • logging slow query

    线程正在将语句写入到慢查询日志中。

  • login

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

  • manage keys

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

  • Opening system tables

    线程尝试打开系统表(例如时区或日志表)。

  • Opening tables

    线程尝试打开表。这应该是一个非常快速的过程,除非某些事情阻止了打开。例如,ALTER TABLELOCK TABLE语句可以阻止打开表直到语句完成。也值得检查您的table_open_cache值是否足够大。

    对于系统表,使用Opening system tables状态。

  • optimizing

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

  • preparing

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

  • preparing for alter table

    服务器正在准备执行一个在-placeALTER TABLE语句。

  • Purging old relay logs

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

  • query end

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

  • Receiving from client

    服务器正在从客户端读取一个数据包。

  • Removing duplicates

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

  • 删除临时表

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

  • 重命名

    线程正在重命名一个表。

  • 重命名结果表

    线程正在处理一个ALTER TABLE语句,已经创建了新表,并且正在将其重命名以替换原始表。

  • 重新打开表

    线程获取了表的锁,但是在获取锁后发现底层表结构已经改变。它已经释放了锁,关闭了表,并且正在尝试重新打开它。

  • 通过排序修复

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

  • Repair done

    线程已经完成了多线程MyISAM表的修复操作。

  • Repair with keycache

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

  • Rolling back

    线程正在回滚事务。

  • Saving state

    对于MyISAM表的修复或分析操作,线程正在将新的表状态保存到.MYI文件头中。状态包括行数、AUTO_INCREMENT计数器和键分布信息等。

  • Searching rows for update

    线程正在执行首阶段,以找到所有匹配行,然后更新它们。这需要在UPDATE语句中更改使用的索引时。

  • Sending data

    这个状态现在已经包含在Executing状态中。

  • 客户端发送

    服务器正在将包写入客户端。

  • 设置

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

  • 分组排序

    线程正在对一个GROUP BY进行排序。

  • 排序顺序

    线程正在对一个ORDER BY进行排序。

  • 索引排序

    线程正在对MyISAM表进行索引排序,以便在优化操作中更快速访问。

  • 结果排序

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

  • 开始

    语句执行的初始阶段。

  • statistics

    服务器正在计算统计数据以开发查询执行计划。如果线程在这个状态下花费了很长时间,服务器可能是磁盘瓶颈进行其他工作。

  • System lock

    线程已经调用了mysql_lock_tables(),但自从那以来线程状态没有被更新。这是一个非常通用的状态,可以由于许多原因而发生。

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

    对于系统表,使用Locking system tables状态。

  • update

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

  • Updating

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

  • 更新主表

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

  • 更新参考表

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

  • 用户锁

    线程将请求或正在等待使用GET_LOCK()调用的建议锁。对于SHOW PROFILE,这个状态表示线程正在请求锁(而不是等待它)。

  • 用户睡眠

    线程已经调用了SLEEP()调用的函数。

  • 等待提交锁

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

  • waiting for handler commit

    线程正在等待事务提交,而不是其他查询处理部分。

  • Waiting for tables

    线程收到通知,表的 underlying 结构已经改变,它需要重新打开该表以获取新的结构。但是,以便重新打开该表,它必须等待所有其他线程关闭该表。

    如果另一个线程在该表上执行了FLUSH TABLES或以下语句之一,该通知将发生:FLUSH TABLES tbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE

  • Waiting for table flush

    线程正在执行FLUSH TABLES,等待所有线程关闭表或线程收到通知说某个表的结构已经改变需要重新打开该表以获取新的结构。但是,为了重新打开该表,它必须等待其他所有线程都关闭该表。

    如果另一个线程在该表上执行了FLUSH TABLES或以下语句之一,该通知将发生:FLUSH TABLES tbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE

  • 等待lock_类型

    服务器正在等待获取THR_LOCK锁或元数据锁定子系统的锁,lock_类型表示锁的类型。

    这个状态表示对THR_LOCK锁的等待:

    • 等待表级锁

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

    • 等待事件元数据锁

    • 等待全局读锁

    • 等待架构元数据锁

    • 等待存储函数元数据锁

    • 等待存储过程元数据锁

    • 等待表元数据锁

    • 等待触发器元数据锁

    关于表锁指示器的信息,请见第10.11.1节,“内部锁定方法”。关于元数据锁定的信息,请见第10.11.4节,“元数据锁定”。要查看哪些锁阻塞了锁请求,请使用性能chema锁表,详见第29.12.13节,“性能schema锁表”

  • Waiting on cond

    一个通用的状态,在该状态下线程等待某个条件变为真。没有可用状态信息。

  • Writing to net

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