### 8.14.3 一般线程状态

[](<>)

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

-   [](<>) [](<>) `创建后`

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

-   [](<>) [](<>) `更改表`

    服务器正在就地执行[`更改表`](alter-table.html).

-   [](<>) [](<>) `分析`

    线程正在计算一个`MyISAM`表键分布（例如，对于[`分析表`](analyze-table.html)）。

-   [](<>) [](<>) `检查权限`

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

-   [](<>) [](<>) `检查表`

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

-   [](<>) [](<>) `打扫干净`

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

-   [](<>) [](<>) `收盘`

    该线程正在将更改的表数据刷新到磁盘并关闭已使用的表。这应该是一个快速的操作。如果没有，请确认您没有完整的磁盘并且该磁盘没有被大量使用。

-   [](<>) [](<>) `将 HEAP 转换为磁盘`

    线程正在将内部临时表从`记忆`表到磁盘表。

-   [](<>) [](<>) `复制到 tmp 表`

    线程正在处理一个[`更改表`](alter-table.html)陈述。此状态发生在创建具有新结构的表之后但在将行复制到其中之前。

    对于处于这种状态的线程，可以使用 Performance Schema 来获取有关复制操作的进度。看[第 27.12.5 节，“性能模式阶段事件表”](performance-schema-stage-tables.html).

-   [](<>) [](<>) `复制到组表`

    如果一个语句有不同`订购方式`和`通过...分组`条件，行按组排序并复制到临时表中。

-   [](<>) [](<>) `复制到 tmp 表`

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

-   [](<>) [](<>) `复制到磁盘上的 tmp 表`

    服务器正在复制到磁盘上的临时表。临时结果集变得太大（请参阅[第 8.4.4 节，“MySQL 中的内部临时表使用”](internal-temporary-tables.html)）。因此，线程将临时表从内存中更改为基于磁盘的格式以节省内存。

-   [](<>) [](<>) `创建索引`

    线程正在处理`ALTER TABLE ...启用键`为一个`MyISAM`桌子。

-   [](<>) [](<>) `创建排序索引`

    线程正在处理一个[`选择`](select.html)这是使用内部临时表解决的。

-   [](<>) [](<>) `创建表`

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

-   [](<>) [](<>) `创建 tmp 表`

    该线程正在内存或磁盘上创建一个临时表。如果表是在内存中创建的，但后来转换为磁盘表，则该操作期间的状态为`复制到磁盘上的 tmp 表`.

-   [](<>) [](<>) `将更改表提交到存储引擎`

    服务器已就地完成[`更改表`](alter-table.html)并提交结果。

-   [](<>) [](<>) `从主表中删除`

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

-   [](<>) [](<>) `从参考表中删除`

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

-   [](<>) [](<>) `丢弃或导入表空间`

    线程正在处理一个`ALTER TABLE ... 丢弃表空间`要么`ALTER TABLE ... 导入表空间`陈述。

-   [](<>) [](<>) `结尾`

    这发生在最后但在清理之前[`更改表`](alter-table.html),[`创建视图`](create-view.html),[`删除`](delete.html),[`插入`](insert.html),[`选择`](select.html)， 要么[`更新`](update.html)陈述。

    为了`结尾`状态，可能会发生以下操作：

    -   将事件写入二进制日志

    -   释放内存缓冲区，包括 blob

-   [](<>) [](<>) `执行`

    线程已开始执行语句。

-   [](<>) [](<>) `init_command 的执行`

    线程正在执行值中的语句`初始化命令`系统变量。

-   [](<>) [](<>) `释放物品`

    线程已执行命令。这种状态通常紧随其后`打扫干净`.

-   [](<>) [](<>) `全文初始化`

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

-   [](<>) [](<>) `在里面`

    这发生在初始化之前[`更改表`](alter-table.html),[`删除`](delete.html),[`插入`](insert.html),[`选择`](select.html)， 要么[`更新`](update.html)陈述。服务器在此状态下执行的操作包括刷新二进制日志和`InnoDB`日志。

-   [](<>) [](<>) `被杀`

    有人发了一个[`杀`](kill.html)向线程声明，它应该在下次检查终止标志时中止。在 MySQL 的每个主要循环中都会检查该标志，但在某些情况下，线程可能仍需要很短的时间才能结束。如果线程被其他线程锁定，则在其他线程释放其锁定后立即终止。

-   [](<>) [](<>) `锁定系统表`

    线程正在尝试锁定系统表（例如，时区或日志表）。

-   [](<>) [](<>) `记录慢查询`

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

-   [](<>) [](<>) `登录`

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

-   [](<>) [](<>) `管理密钥`

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

-   [](<>) [](<>) `打开系统表`

    线程正在尝试打开系统表（例如，时区或日志表）。

-   [](<>) [](<>) `打开表`

    该线程正在尝试打开一个表。这应该是一个非常快的过程，除非有东西阻止打开。例如，一个[`更改表`](alter-table.html)或一个[`锁表`](lock-tables.html)语句可以阻止打开表，直到语句完成。还值得检查您的[`table_open_cache`](server-system-variables.html#sysvar_table_open_cache)值足够大。

    对于系统表，`打开系统表`改为使用状态。

-   [](<>) [](<>) `优化`

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

-   [](<>) [](<>) `准备`

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

-   [](<>) [](<>) `清除旧的中继日志`

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

-   [](<>) [](<>) `查询结束`

    此状态发生在处理查询之后但在`释放物品`状态。

-   [](<>) [](<>) `从客户端接收`

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

-   [](<>) [](<>) `删除重复项`

    查询正在使用[`选择不同的`](select.html)以这种方式，MySQL 无法在早期阶段优化掉不同的操作。因此，MySQL 需要一个额外的阶段来删除所有重复的行，然后再将结果发送到客户端。

-   [](<>) [](<>) `删除 tmp 表`

    线程处理完一个内部临时表[`选择`](select.html)陈述。如果没有创建临时表，则不使用此状态。

-   [](<>) [](<>) `改名`

    该线程正在重命名一个表。

-   [](<>) [](<>) `重命名结果表`

    线程正在处理一个[`更改表`](alter-table.html)语句，已创建新表，并正在重命名它以替换原始表。

-   [](<>) [](<>) `重新打开表`

    线程获得了表的锁，但在获得锁后注意到底层表结构发生了变化。它释放了锁，关闭了表，并试图重新打开它。

-   [](<>) [](<>) `通过分类修复`

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

-   [](<>) [](<>) `准备更改表`

    服务器正准备就地执行[`更改表`](alter-table.html).

-   [](<>) [](<>) `维修完成`

    该线程已完成一个多线程修复`MyISAM`桌子。

-   [](<>) [](<>) `使用 keycache 修复`

    修复代码正在使用通过密钥缓存一一创建密钥。这比`通过分类修复`.

-   [](<>) [](<>) `滚回来`

    线程正在回滚事务。

-   [](<>) [](<>) `保存状态`

    为了`MyISAM`表操作，如修复或分析，线程正在将新表状态保存到`。我的我`文件头。状态包括诸如行数、`自动递增`计数器和密钥分布。

-   [](<>) [](<>) `搜索行以进行更新`

    该线程正在执行第一阶段以在更新它们之前找到所有匹配的行。如果[`更新`](update.html)正在更改用于查找相关行的索引。

-   `发送数据`

    *MySQL 8.0.17 之前*: 线程正在读取和处理 a 的行[`选择`](select.html)语句，并向客户端发送数据。由于在此状态期间发生的操作往往会执行大量磁盘访问（读取），因此它通常是给定查询生命周期内运行时间最长的状态。*MySQL 8.0.17 及更高版本*：此状态不再单独表示，而是包含在`执行`状态。

-   [](<>) [](<>) `发送给客户`

    服务器正在向客户端写入数据包。

-   [](<>) [](<>) `设置`

    线程开始一个[`更改表`](alter-table.html)手术。

-   [](<>) [](<>) `分组排序`

    线程正在做一个排序以满足`通过...分组`.

-   [](<>) [](<>) `排序排序`

    线程正在执行某种排序以满足`订购方式`.

-   [](<>) [](<>) `排序索引`

    该线程正在对索引页面进行排序，以便在`MyISAM`表优化操作。

-   [](<>) [](<>) `排序结果`

    为一个[`选择`](select.html)声明，这类似于`创建排序索引`，但对于非临时表。

-   [](<>) [](<>) `开始`

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

-   [](<>) [](<>) `统计数据`

    服务器正在计算统计信息以制定查询执行计划。如果一个线程长时间处于这种状态，服务器可能正在磁盘绑定执行其他工作。

-   [](<>) [](<>) [](<>) [](<>) `系统锁`

    该线程已调用`mysql_lock_tables()`并且从那以后线程状态没有更新。这是一种非常普遍的状态，可能由于多种原因而发生。

    例如，线程将要请求或正在等待表的内部或外部系统锁。这可能发生在[`InnoDB`](innodb-storage-engine.html)在执行期间等待表级锁[`锁定表`](lock-tables.html).如果此状态是由外部锁请求引起的，并且您没有使用多个[**mysqld**](mysqld.html)访问相同的服务器[`MyISAM`](myisam-storage-engine.html)表，您可以使用[`--skip-external-locking`](server-options.html#option_mysqld_external-locking)选项。但是，默认情况下外部锁定是禁用的，因此该选项很可能没有效果。为了[`显示资料`](show-profile.html)，这个状态意味着线程正在请求锁（不等待它）。

    对于系统表，`锁定系统表`改为使用状态。

-   [](<>) [](<>) `更新`

    线程正准备开始更新表。

-   [](<>) [](<>) `更新`

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

-   [](<>) [](<>) `更新主表`

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

-   [](<>) [](<>) `更新参考表`

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

-   [](<>) [](<>) `用户锁`

    线程将要请求或正在等待使用 a 请求的咨询锁[`GET_LOCK()`](locking-functions.html#function_get-lock)称呼。为了[`显示资料`](show-profile.html)，这个状态意味着线程正在请求锁（不等待它）。

-   [](<>) [](<>) `用户睡眠`

    线程调用了一个[`睡觉（）`](miscellaneous-functions.html#function_sleep)称呼。

-   [](<>) [](<>) `等待提交锁`

    [`带读锁的刷新表`](flush.html#flush-tables-with-read-lock)正在等待提交锁。

-   [](<>) [](<>) `等待处理程序提交`

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

-   [](<>) [](<>) `等待表`

    线程收到表的底层结构已更改的通知，它需要重新打开表以获取新结构。但是，要重新打开表，它必须等到所有其他线程都关闭了有问题的表。

    如果另一个线程使用了此通知，则会发生此通知[`同花顺表`](flush.html#flush-tables)或有问题的桌子上的以下陈述之一：`同花顺 *`tbl_name`*`,[`更改表`](alter-table.html),[`重命名表`](rename-table.html),[`维修台`](repair-table.html),[`分析表`](analyze-table.html)， 要么[`优化表`](optimize-table.html).

-   [](<>) [](<>) `等待表刷新`

    线程正在执行[`同花顺表`](flush.html#flush-tables)并且正在等待所有线程关闭它们的表，或者线程收到表的底层结构已更改并且需要重新打开表以获取新结构的通知。但是，要重新打开表，它必须等到所有其他线程都关闭了有问题的表。

    如果另一个线程使用了此通知，则会发生此通知[`同花顺表`](flush.html#flush-tables)或有问题的桌子上的以下陈述之一：`同花顺 *`tbl_name`*`,[`更改表`](alter-table.html),[`重命名表`](rename-table.html),[`维修台`](repair-table.html),[`分析表`](analyze-table.html)， 要么[`优化表`](optimize-table.html).

-   [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) [](<>) `等待*`锁定类型`* 锁`

    服务器正在等待获取`THR_LOCK`锁或来自元数据锁定子系统的锁，其中*`锁定类型`*表示锁的类型。

    此状态表示等待`THR_LOCK`：

    -   `等待表级锁`

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

    -   `等待事件元数据锁定`

    -   `等待全局读锁`

    -   `等待模式元数据锁定`

    -   `等待存储函数元数据锁`

    -   `等待存储过程元数据锁`

    -   `等待表元数据锁`

    -   `等待触发元数据锁`

        有关表锁定指示器的信息，请参阅[第 8.11.1 节，“内部锁定方法”](internal-locking.html).有关元数据锁定的信息，请参阅[第 8.11.4 节，“元数据锁定”](metadata-locking.html).要查看哪些锁正在阻塞锁请求，请使用描述的性能模式锁表[第 27.12.13 节，“性能模式锁定表”](performance-schema-lock-tables.html).

-   [](<>) [](<>) `等待条件`

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

-   [](<>) [](<>) `写到网络`

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