show processlist
简介
show processlist是显示用户正在运行的线程,需要注意的是,出了root用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程.除非单独这个用户赋予了process权限.
show processlist 显示的信息都是来自MySQL系统库 information_schema 中的 processlist 表。所以使用下面的查询语句可以获得相同的结果:
select * from information_schema.processlist
我们看看查询出来的结果都是什么意思
结果
- id:这个线程的唯一标识,当发现这个线程有问题的时候,可以用kill 命令,加上这个线程ID值将这个线程杀掉,前面我们说了show processlist 显示的信息时来自information_schema.processlist 表,所以这个Id就是这个表的主键。
- user就是启动这个线程的用户
- host记录了发送请求的客户端的up和端口号.通过这些信息在排查问题的时候,我们可以定位到是哪个客户端的那个进程发送的请求
- DB:当前执行的命令是在哪一个数据库上.如果没有指定数据库,则该值为null
- command是指刺客该线程正在执行的命令,.这个很复杂下面单独解释
- time:表示该线程处于当前状态的时间.
- state:线程的状态,和command对应.下面1单独解释
- info一般记录的是线程的执行的语句.默认只显示前100个字符,也就是看到的语句很可能是截断了的,要看全部信息,需要使用show full processlist
来单独看一下command的值
- Binlog Dump: 主节点正在将二进制日志 ,同步到从节点
- Change User: 正在执行一个 change-user 的操作
- Close Stmt: 正在关闭一个Prepared Statement 对象
- Connect: 一个从节点连上了主节点
- Connect Out: 一个从节点正在连主节点
- Create DB: 正在执行一个create-database 的操作
- Daemon: 服务器内部线程,而不是来自客户端的链接
- Debug: 线程正在生成调试信息
- Delayed Insert: 该线程是一个延迟插入的处理程序
- Drop DB: 正在执行一个 drop-database 的操作
- Execute: 正在执行一个 Prepared Statement
- Fetch: 正在从Prepared Statement 中获取执行结果
- Field List: 正在获取表的列信息
- Init DB: 该线程正在选取一个默认的数据库
- Kill : 正在执行 kill 语句,杀死指定线程
- Long Data: 正在从Prepared Statement 中检索 long data
- Ping: 正在处理 server-ping 的请求
- Prepare: 该线程正在准备一个 Prepared Statement
- ProcessList: 该线程正在生成服务器线程相关信息
- Query: 该线程正在执行一个语句
- Quit: 该线程正在退出
- Refresh:该线程正在刷表,日志或缓存;或者在重置状态变量,或者在复制服务器信息
- Register Slave: 正在注册从节点
- Reset Stmt: 正在重置 prepared statement
- Set Option: 正在设置或重置客户端的 statement-execution 选项
- Shutdown: 正在关闭服务器
- Sleep: 正在等待客户端向它发送执行语句
- Statistics: 该线程正在生成 server-status 信息
- Table Dump: 正在发送表的内容到从服务器
- Time: Unused
state的值
以下引用自官方文档
After create
当线程在创建表的函数的末尾创建表(包括内部临时表)时,会发生这种情况。即使由于某些错误而无法创建表,也会使用此状态。
altering table
服务器正在执行就地服务 ALTER TABLE
。
Analyzing
线程正在计算MyISAM
表键分布(例如for ANALYZE TABLE
)。
checking permissions
线程正在检查服务器是否具有执行该语句所需的特权。
Checking table
线程正在执行表检查操作。
cleaning up
该线程已处理了一条命令,并准备释放内存并重置某些状态变量。
closing tables
线程正在将已更改的表数据刷新到磁盘并关闭已使用的表。这应该是一个快速的操作。如果没有,请验证您没有完整的磁盘,并且磁盘使用率不是很高。
committing alter table to storage engine
服务器已就地完成 ALTER TABLE
并提交结果。
converting HEAP to MyISAM
线程正在将内部临时表从 MEMORY
表转换为磁盘 MyISAM
表。
copy to tmp table
线程正在处理一条ALTER TABLE
语句。在创建具有新结构的表之后但在将行复制到其中之前,将发生此状态。
Copying to group table
如果语句具有不同的条件ORDER BY
和 GROUP BY
条件,则按组对行进行排序并将其复制到临时表中。
Copying to tmp table
服务器正在复制到内存中的临时表。
Copying to tmp table on disk
服务器正在复制到磁盘上的临时表。临时结果集太大(请参见 第8.4.4节“ MySQL中的内部临时表使用”)。因此,线程正在将临时表从内存格式更改为基于磁盘的格式,以节省内存。
Creating index
线程正在处理ALTER TABLE ... ENABLE KEYS
一个MyISAM
表。
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
or ALTER TABLE ... IMPORT TABLESPACE
语句。
end
这发生在结束,但的清理之前 ALTER TABLE
, CREATE VIEW
, DELETE
, INSERT
, SELECT
,或 UPDATE
语句。
executing
该线程已开始执行一条语句。
Execution of init_command
线程正在使用init_command
系统变量的值执行语句 。
freeing items
线程已执行命令。在此状态下完成的某些项目释放涉及查询缓存。此状态通常后跟cleaning up
。
FULLTEXT initialization
服务器正在准备执行自然语言的全文本搜索。
init
出现这种情况的初始化之前 ALTER TABLE
, DELETE
, INSERT
, SELECT
,或 UPDATE
语句。服务器在此状态下采取的操作包括刷新二进制日志,InnoDB
日志和一些查询缓存清除操作。
对于end
状态,可能发生以下操作:
- 更改表中的数据后删除查询缓存条目
- 将事件写入二进制日志
- 释放内存缓冲区,包括用于blob的缓冲区
Killed
有人KILL
向该线程发送了一条语句,下次检查kill标志时,它将中止。在MySQL的每个主循环中都会检查该标志,但是在某些情况下,线程死亡仍然可能需要很短的时间。如果该线程被其他某个线程锁定,则杀死操作将在另一个线程释放其锁定后立即生效。
logging slow query
线程正在将一条语句写入慢速查询日志。
login
连接线程的初始状态,直到客户端已成功通过身份验证。
manage keys
服务器正在启用或禁用表索引。
NULL
该状态用于SHOW PROCESSLIST
状态。
Opening tables
线程正在尝试打开表。除非有什么阻止打开的步骤,否则这应该是非常快速的过程。例如,一个ALTER TABLE
或一条 LOCK TABLE
语句可以阻止在该语句完成之前打开表。还值得检查您的table_open_cache
价值是否足够大。
optimizing
服务器正在对查询执行初始优化。
preparing
此状态在查询优化期间发生。
preparing for alter table
服务器正在准备执行就地 ALTER TABLE
。
Purging old relay logs
该线程正在删除不需要的中继日志文件。
query end
此状态在处理查询之后但在该freeing items
状态之前发生 。
Reading from net
服务器正在从网络读取数据包。
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
文件头。状态包括诸如行数, AUTO_INCREMENT
计数器和密钥分布之类的信息。
Searching rows for update
线程正在执行第一阶段以在更新所有匹配的行之前找到它们。如果 UPDATE
更改了用于查找所涉及行的索引,则必须执行此操作。
Sending data
线程正在读取和处理SELECT
语句的行 ,并将数据发送到客户端。因为在此状态下发生的操作往往会执行大量磁盘访问(读取),所以它通常是给定查询生命周期中运行时间最长的状态。
setup
线程正在开始ALTER TABLE
操作。
Sorting for group
线程正在做某种排序以满足GROUP BY
。
Sorting for order
线程正在做某种排序以满足ORDER BY
。
Sorting index
该线程正在对索引页进行排序,以在MyISAM
表优化操作期间更有效地进行访问。
Sorting result
对于SELECT
语句,这类似于Creating sort index
,但是对于非临时表。
statistics
服务器正在计算统计信息以制定查询执行计划。如果线程长时间处于此状态,则服务器可能是磁盘绑定的,正在执行其他工作。
System lock
从此线程已被调用mysql_lock_tables()
,并且线程状态尚未更新。这是一种非常普遍的状态,可能由于多种原因而发生。
例如,线程将要请求或正在等待表的内部或外部系统锁定。当InnoDB
执行时等待表级锁定时, 可能会发生这种情况LOCK TABLES
。如果此状态是由对外部锁的请求引起的,并且您没有使用正在访问同一 表的多个mysqld服务器,则MyISAM
可以使用该--skip-external-locking
选项禁用外部系统锁 。但是,默认情况下将禁用外部锁定,因此此选项可能无效。对于 SHOW PROFILE
,此状态表示线程正在请求锁定(不等待它)。
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 global read lock
FLUSH TABLES WITH READ LOCK
正在等待全局读取锁定或read_only
正在设置全局 系统变量。
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
有关表锁定指示器的信息,请参见 第8.11.1节“内部锁定方法”。有关元数据锁定的信息,请参见第8.11.4节“元数据锁定”。
Waiting on cond
线程正在等待条件变为真的一般状态。没有可用的特定状态信息。
Writing to net
服务器正在将数据包写入网络。