当前位置: 代码网 > it编程>数据库>Mysql > MySQL使用SHOW PROCESSLIST的实现

MySQL使用SHOW PROCESSLIST的实现

2025年03月28日 Mysql 我要评论
1、show processlist 显示进程列表show [full] processlist 用于查看当前mysql服务器上的所有运行中的进程列表信息。这个命令可以帮助我们了解哪些查询正在执行,它

1、show processlist 显示进程列表

show [full] processlist 用于查看当前mysql服务器上的所有运行中的进程列表信息。这个命令可以帮助我们了解哪些查询正在执行,它们的状态是什么,以及它们已经执行了多长时间。
示例:

mysql> show processlist;
+----+------+-----------+----+---------+------+-------+------------------+
| id | user | host      | db | command | time | state | info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 5  | root | localhost |    | query   | 0    | init  | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
1 row in set (0.00 sec)

其中每行显示的信息包括:

  • id: 线程的唯一标识符。
  • user: 执行该命令的用户名。
  • host: 用户的主机名。通常是客户端ip地址、端口号或者都有。
  • db: 当前线程正在工作的数据库。如果没有选定数据库,则为null。
  • command: 线程正在执行的命令类型。例如:sleep,query,locked等。
  • time: 命令开始执行以来的秒数。对于'sleep'命令,这是线程进入睡眠状态的时间。
  • state: 显示线程的状态信息。这对找出性能问题特别有用。
  • info: 显示线程正在执行的查询。若没有查询在执行则该列为null。

如果没有 full 关键字, show processlist 则仅显示 info 字段中每个语句的前 100 个字符。

2、线程command有以下值:

  • binlog dump:这是用于将二进制日志内容发送到副本的复制源上的线程。
  • change user:线程正在执行更改用户操作。
  • close stmt:线程正在关闭预备语句。
  • connect:被连接到源的复制接收器线程以及复制工作器线程使用。
  • connect out:副本正在连接到其源。
  • create db:线程正在执行创建数据库操作。
  • daemon:此线程对服务器内部而言,不是为客户端连接提供服务的线程。
  • debug:线程正在生成调试信息。
  • delayed insert:线程是一个延迟插入处理器。
  • drop db:线程正在执行删除数据库操作。
  • error:execute:线程正在执行预备语句。
  • fetch:线程正在获取执行预备语句的结果。
  • field list:线程正在检索表列的信息。
  • init db:线程正在选择默认数据库。
  • kill:线程正在杀死另一个线程。
  • long data:线程正在检索执行预备语句结果中的长数据。
  • ping:线程正在处理服务器ping请求。
  • prepare:线程正在准备预备语句。
  • processlist:线程正在生成关于服务器线程的信息。
  • query:用户客户端在执行查询时使用,由单线程复制应用程序线程使用,以及由复制协调器线程使用。
  • quit:线程正在终止。
  • refresh:线程正在刷新表、日志或缓存,或重置状态变量或复制服务器信息。
  • register slave:线程正在注册副本服务器。
  • reset stmt:线程正在重置预备语句。
  • set option:线程正在设置或重置客户端语句执行选项。
  • shutdown:线程正在关闭服务器。
  • sleep:线程正在等待客户端发送新的语句给它。
  • statistics:线程正在生成服务器状态信息。
  • time:未使用。

3、线程状态state分类有以下值

以下列表描述了与通用查询处理相关的线程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语句。在已创建新结构的表之后但在将行复制进去之前发生此状态。
  • 对于此状态的线程,可以使用性能模式来获取复制操作的进度。
  • 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:线程正在在内存或磁盘上创建临时表。如果在内存中创建了表,但稍后将其转换为磁盘上的表,则在该操作期间的状态为copying to tmp table on disk。
  • 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:线程已执行一条命令。这个状态通常在cleaning up之前出现。
  • fulltext initialization:服务器正在准备进行自然语言全文搜索。
  • init:在初始化alter table,delete,insert,select或update语句之前发生。在这种状态下,服务器采取的操作包括刷新二进制日志和innodb日志。
  • killed:有人向线程发送了一个kill语句,它应该在下次检查kill标志时中止。该标志在mysql的每一个主要循环中都会被检查,但在某些情况下,线程可能还需要短暂的时间才能死亡。如果线程被其他线程锁定,则在其他线程释放其锁定后立即生效。
  • locking system tables:线程正在尝试锁定一个系统表(例如,一个时区或日志表)。
  • logging slow query:线程正在将语句写入慢查询日志。
  • login:连接线程的初始状态,直到客户端成功进行身份验证。
  • manage keys:服务器正在启用或禁用表索引。
  • opening system tables:线程正在尝试打开一个系统表(例如,一个时区或日志表)。
  • opening tables:线程正在尝试打开表。这应该是非常快速的过程,除非有什么阻止打开。例如,alter table或lock 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无法在早期阶段优化掉distinct操作。由于此原因,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文件头。状态包括行数、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语句,此为与creating sort index类似,但适用于非临时表。
  • 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或以下语句之一: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 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)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com