侧边栏壁纸
博主头像
码森林博主等级

一起走进码森林,享受编程的乐趣,发现科技的魅力,创造智能的未来!

  • 累计撰写 145 篇文章
  • 累计创建 73 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

MySQL | PROCESSLIST 详解

码森林
2022-12-09 / 0 评论 / 0 点赞 / 439 阅读 / 4,005 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-12-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

本文基于 MySQL 8.0.25。

PROCESSLIST

PROCESSLIST 是 MySQL 进程列表,指示服务器内执行的线程集当前正在执行的操作。

对应的表为 information_schema.PROCESSLIST,通过 SHOW [FULL] PROCESSLIST 可以进行查看,没有 FULL 关键字的话,info 字段只会显示每个语句的前 100 个字符。执行结果如下:

image-20221208173330133

输出有以下列:

  • **Id:**连接标识符。同时显示在information_schema.threads表的 PROCESLIST_ID 列中,并由线程中的 CONTECTION_ID() 函数返回。
  • **User:**发布声明的 MySQL 用户。system user的值是指服务器生成的非客户端线程,用于内部处理任务,例如延迟行处理程序线程或副本主机上使用的I/O(接收器)或 SQL(应用程序)线程。对于system userHost列中没有指定主机。unauthenticated user是指已与客户端连接相关联但尚未对客户端用户进行身份验证的线程。event_scheduler是指监控计划事件的线程。
  • **Host:**发布语句的客户端的主机名(system user除外,系统用户没有主机)。TCP/IP连接的主机名以host_name:client_port格式报告,以便更容易确定哪个客户端在做什么。
  • **db:**线程的默认数据库,如果没有选择,则为NULL
  • **Command:**线程代表客户端执行的命令类型,如果会话处于空闲状态,则为Sleep
  • **Time:**线程处于当前状态的时间(以秒为单位)。对于副本 SQL 线程,值是上次复制事件的时间戳与副本主机实时之间的秒数。
  • **State:**指示线程正在做什么的操作、事件或状态。大多数州对应于非常快速的操作。如果线程在给定状态下停留数秒钟,可能会有一个问题需要调查。
  • **Info:**线程正在执行的语句,如果它没有执行任何语句,则为NULL。该语句可能是发送到服务器的语句,或者如果语句执行其他语句,则可能是最内部的语句。例如,如果CALL语句执行正在执行 SELECT 语句的存储过程,则Info值将显示 SELECT 语句。

PROCESSLIST Command 详解

线程可以具有以下任何Command值:

Command值 说明
Binlog Dump 这是复制源上的一个线程,用于将二进制日志内容发送到副本。
Change user 线程正在执行更改用户操作。
Close stmt 线程正在关闭一个准备好的语句。
Connect 用于连接到源的复制接收线程和复制工作线程。
Connect Out 一个副本正在连接到其来源。
Create DB 线程正在执行创建数据库操作。
Daemon 此线程是服务器内部的,而不是服务客户端连接的线程。
Debug 线程正在生成调试信息。
Delayed insert 线程是一个延迟插入处理程序。
Drop DB 正在执行一个 drop-database 的操作。
Error
Execute 正在执行一个 Prepared Statement。
Fetch 正在从Prepared Statement 中获取执行结果。
Field List 正在获取表的列信息。
Init DB 该线程正在选取一个默认的数据库。
Kill 正在执行 kill 语句,杀死指定进程。
Long Data 正在从Prepared Statement 中检索 long data。
Ping 线程正在处理服务器 ping 请求。
Prepare 该进程正在准备一个 Prepared Statement。
Processlist 该线程正在生成有关服务器线程的信息。
Query 在通过单线程复制应用线程以及复制协调线程执行查询时,用于用户客户端。
Quit 线程正在终止。
Refresh 线程是刷新表、日志或缓存,或重置状态变量或复制服务器信息。
Register Slave 线程正在注册一个副本服务器。
Reset stmt 线程正在重置准备的语句。
Set option 线程正在设置或重置客户端语句执行选项。
Shutdown 线程正在关闭服务器。
Sleep 线程正在等待客户端向其发送新语句。
Statistics 线程正在生成服务器状态信息。
Time 未使用。

PROCESSLIST State 详解

  • 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 BYGROUP 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

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

  • deleting from main table

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

  • deleting from reference tables

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

  • discard_or_import_tablespace

    线程正在执行ALTER TABLE ... DISCARD TABLESPACEALTER TABLE ... IMPORT TABLESPACE语句。

  • end

    发生在ALTER TABLECREATE VIEWDELETEINSERTSELECTUPDATE语句的清理之前。

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

    • 将事件写入二进制日志。
    • 释放内存缓冲区,包括blob。
  • executing

    线程已经开始执行语句。

  • Execution of init_command

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

  • freeing items

    线程已经执行了命令。在这个状态中涉及的查询缓存可以得到一些释放。这个状态通常后面跟随 cleaning up 状态。

  • FULLTEXT initialization

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

  • init

    这发生在ALTER TABLEDELETEINSERTSELECTUPDATE语句初始化之前。服务器在此状态下采取的行动包括刷新二进制日志和InnoDB日志。

  • Killed

    程序对线程发送了KILL语句,并且它应该放弃下一次对 KILL 标记的检查。 这个标记在每一个MySQL的主要循环中被检查,但在某些情况下,它可能需要令线程在很短的时间内死亡。 如果这个线程被其他线程锁住了,这个KILL操作会在其他线程释放锁的瞬时执行。

  • Locking system tables

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

  • 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

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

  • Purging old relay logs

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

  • query end

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

  • 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

    修复指令正在利用索引缓存一个一个地创建新索引。它会比 Repair by sorting 慢些。

  • Rolling back

    线程正在回滚事务。

  • Saving state

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

  • Searching rows for update

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

  • Sending data

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

    MySQL 8.0.17及更高版本:此状态不再单独指示,而是包含在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,此状态表示线程请求锁定(而非等待)。

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

  • 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 tbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLE,则会发出此通知。

  • Waiting for table flush

    线程正在执行FLUSH TABLES,并等待所有线程关闭其表,或者线程收到通知,表示表的底层结构已更改,需要重新打开表才能获得新结构。但是,要重新打开表,它必须等到所有其他线程都关闭了相关表。

    如果另一个线程在相关表上使用了以下语句之一,FLUSH TABLES tbl_nameALTER 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
  • Waiting on cond

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

  • Writing to net

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

0

评论区