本文基于 MySQL 8.0.25。
PROCESSLIST
PROCESSLIST 是 MySQL 进程列表,指示服务器内执行的线程集当前正在执行的操作。
对应的表为 information_schema.PROCESSLIST
,通过 SHOW [FULL] PROCESSLIST
可以进行查看,没有 FULL
关键字的话,info
字段只会显示每个语句的前 100 个字符。执行结果如下:
输出有以下列:
- **Id:**连接标识符。同时显示在
information_schema.threads
表的PROCESLIST_ID
列中,并由线程中的CONTECTION_ID()
函数返回。 - **User:**发布声明的 MySQL 用户。
system user
的值是指服务器生成的非客户端线程,用于内部处理任务,例如延迟行处理程序线程或副本主机上使用的I/O(接收器)或 SQL(应用程序)线程。对于system user
,Host
列中没有指定主机。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 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
语句的清理之前。对于
end
状态,可能会发生以下操作:- 将事件写入二进制日志。
- 释放内存缓冲区,包括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的主要循环中被检查,但在某些情况下,它可能需要令线程在很短的时间内死亡。 如果这个线程被其他线程锁住了,这个KILL操作会在其他线程释放锁的瞬时执行。 -
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无法在早期阶段优化不同的操作。因此,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_name
、ALTER TABLE
、RENAME TABLE
、REPAIR TABLE
、ANALYZE TABLE
或OPTIMIZE TABLE
,则会发出此通知。 -
Waiting for table flush
线程正在执行
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
服务器正在向网络写入数据包。
评论区