MySQL使用SHOW PROCESSLIST 详解

这篇具有很好参考价值的文章主要介绍了MySQL使用SHOW PROCESSLIST 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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值,并且不涉及更专门的活动,如复制。其中许多对于在服务器中查找错误非常有用。文章来源地址https://www.toymoban.com/news/detail-764005.html

  • 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:服务器正在将数据包写入网络。

到了这里,关于MySQL使用SHOW PROCESSLIST 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL查看索引语句:SHOW INDEX 详细讲解

    SHOW INDEX语句是MySQL中用于查看表索引信息的语句。它提供了有关表中索引的详细信息,包括索引名称、索引类型、关联的列等。以下是SHOW INDEX的详细说明: table_name: 需要查询索引的表名。 db_name: (可选)数据库名。如果你已经在某个数据库上下文中,可以省略此参数。

    2024年02月04日
    浏览(34)
  • mysql死锁分析show engine innodb status

    最近在使用mysql的show engine innodb status命令分析死锁,发现了一个有意思的点。就是红框里圈出来的这个。 红框的数据所代表的是sql语句需要获取的行锁。实际上,这个值应该是-1才对,很纳闷,为什么会展示7fffffff呢?其实这个事和innodb的一条关于有符号数的规定有关系。

    2024年02月13日
    浏览(34)
  • 【MySQL命令】show slave status\G 超详细全面解释

         这个命令是DBA日常运维中常用来查看主从状态的命令,很多监控工具也会使用到该命令监控主从状态是否正常,主从延迟,备份工具获取位点信息等。作为常用日常命令,一定要完全理解该命令的输出。今天主要结合 官方文档 和 实际输出 详细解释该命令。达到完全搞

    2024年02月04日
    浏览(25)
  • Cisco思科交换机show mac address-table命令使用详解

    show mac address-table命令用于显示交换机的MAC地址表。 该表记录了每个接口和与之关联的MAC地址。 #show mac address-table ?    --当在默认情况下输入“?”,系统会自动识别为 help 命令。   address       Address to lookup in the table               --要查找的MAC地址   aging-time    MAC addres

    2024年02月03日
    浏览(22)
  • 使用show effective grants查看权限

    用户 show grants 显示只有连接权限,但该用户却能执行 sbtest.*下的所有操作 MySQL 官方手册,有这样一段话 https://dev.mysql.com/doc/refman/8.0/en/show-grants.html SHOW GRANTS does not display privileges that are available to the named account but are granted to a different account. For example, if an anonymous account exists,

    2024年02月16日
    浏览(30)
  • Vue中v-if与v-show区别详解

    在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使我们能够更轻松地构建出优雅而高效的Web应用程序。

    2024年01月21日
    浏览(34)
  • v-if 和 v-show的区别是什么? 什么时候使用v-if更好? 什么时候用v-show更好?

    v-show 是通过控制display属性来进行DOM的显示与隐藏,主要用于频繁操作; v-if 是真正意义上的条件渲染(销毁和创建元素),条件为true时创建DOM,条件为false时销毁DOM,主要用于大量数据渲染到页面(符合条件就将数据渲染),频繁使用会消耗性能。 性能区别: 1、v-if有更高

    2024年02月11日
    浏览(39)
  • PyCharm中使用matplotlib.pyplot.show()报错MatplotlibDeprecationWarning的解决方案

    其实这只是一个警告,忽略也可。 MatplotlibDeprecationWarning: Support for FigureCanvases without a required_interactive_framework attribute was deprecated in Matplotlib 3.6 and will be removed two minor releases later. MatplotlibDeprecationWarning:在Matplotlib 3.6中,对不带required_interactive_framework属性的FigureCanvas的支持已被

    2024年02月09日
    浏览(27)
  • vue中v-if和v-show的区别和使用场景

            问题:v-if和v-show我们都经常用来控制某一部分内容的显示与隐藏,那么其具体区别是什么呢? 1.v-if v-if是通过增添和删除DOM来控制元素的显示与隐藏的 当判断值为true时在DOM树中加入该DOM元素 当判断值为false时在DOM树中删除该DOM元素  2.v-show v-show是通过改变该元素

    2024年02月03日
    浏览(26)
  • Oracle中没有show tables;如何用指令来显示表名,Excel关于VLOOKUP函数的使用。

    一、问题:Oracle中没有show tables;如何用指令来显示表名。 解决方案: owner =\\\'NAPSDEV\\\'更换为owner =\\\'CNAPSIIDB\\\'。NAPSDEV是用户名,CNAPSIIDB是数据库名。在这里,我想让它显示的是我在Navicat中的CNAPSIIDB数据库下的所有表的名称。所以使用owner =\\\'CNAPSIIDB\\\'作为限制条件。 二、问题:Excel表

    2024年02月15日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包