原文档参见:show processlist 官方文档
show processlist 命令返回的数据会展示给你正在运行的进程。你也可以从INFOMATION_SCHEMA的processlist表中获取这些数据,还可以通过mysqldadmin processlist命令行获取。如果你有进程权限,则可以查看所有的进程。否则你只能看你自己的进程(意思就是,只能看到和你登录mysql账户相关的进程)。如果没有使用full关键字,只会返回前100条进程信息。
进程信息也可以通过performance_schema的threads表获取。但是访问threads表不需要一个互斥锁,对服务器的印象也会很小。通过information.processlist和show processlist 会差生负面的性能影响,因为他们需要一个互斥锁。threads表还会展示一些后台进程的信息,而另外两种方式没有。这就一位置threads表可以用来监控其他信息源不能监控的活动。
show processlist 语句非常用用,如果你发现“too many connections”错误信息,并且想查明正在进行的线程,MySQL保留一个额外的连接,供具有超级特权的账户使用,以确保管理员始终能够连接和检查系统(假设您没有将此特权授予所有用户)。
线程可以使用kill语句被杀死。
下面是一些show processlist的显示例子。
mysql> SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 1030455
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 1004
State: Has read all relay log; waiting for the slave
I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 3112
User: replikator
Host: artemis:2204
db: NULL
Command: Binlog Dump
Time: 2144
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 4. row ***************************
Id: 3113
User: replikator
Host: iconnect2:45781
db: NULL
Command: Binlog Dump
Time: 2086
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 5. row ***************************
Id: 3123
User: stefan
Host: localhost
db: apollon
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
5 rows in set (0.00 sec)
show processlist返回的列有以下含义
Id
连接的唯一标识符。这个值和information_schema.processlist表中的ID,threads表中的processlist_id,connection_id()函数返回值是一样的。可以通过kill Id删除这个连接进程。- User 执行语句的mysql用户。如果这是系统用户,它指的是由服务器产生的非客户端线程来处理内部任务。这可能是用于从库复制或延迟行处理程序的输入/输出或SQL线程。未经身份验证的用户指的是与客户端连接相关联的线程,但是客户端用户的身份验证尚未完成。events_cheduler是指监视预定事件的线程。对于系统用户,主机列中没有指定主机。
Host
发出语句的客户端名称(除了没有主机的系统用户之外)。SHOW PROCESSLIST报告主机名的主机名:client:port格式,以便更容易地确定哪个客户端正在做什么。- db 执行sql的数据库
Command
正在执行线程命令的类型,本文主要详解这个信息。- Time 线程已经在当前状态下的时间,单位为S。
State 一种表示线程正在做什么的动作、事件或状态。大多数状态对应于非常快速的操作。如果一个线程在一个给定的状态下停留了许多秒,那么可能会有一个问题需要被调查。对于 show processlist这个语句来说,状态为null。
Info 线程正在运行的sql语句,或者什么也没有运行的话则为null。sql语句可能是发送到服务器的那个语句,或者是一个最内部的语句,如果语句执行其他语句。比如比如调用一个调用select语句的存储过程,info的值为为这个select语句。
下面对command的各种值做一个解释:
command值 | 解释 |
Binlog Dump | 这是主服务器上的一个线程,用于向从属服务器发送二进制日志内容。 |
Change user | 线程正在执行一个变更用户操作。 |
Close stmt | 线程正在关闭一个准备好的语句。 |
Connect | 一个复制从属mysql连接上了他的主数据库 |
Connect Out | 一个复制从属mysql正在连接他的主数据库 |
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 | 线程正在生成服务器状态信息。 |
Table Dump | 线程正在向从属服务器发送表内容。 |
Time | 从未用过 |
下面对status关键字做一个简介:
下面的列表描述了与一般查询处理相关联的线程状态值,像主从复制这样的更专业的活动非。其中许多功能只适用于在服务器中查找bug。
state值 | 解释 |
After create | 当线程创建一个表(包括内部临时表)时,就会发生这种情况,在创建表的函数的末尾处。即使由于某些错误而不能创建表,也会使用这个状态。 |
Analyzing | 线程正在计算MyISAM表键的分布(例如,用于分析表) |
checking permissions | 线程正在检查服务器是否拥有执行语句所需的特权。 |
Checking table | 线程正在执行一个表格检查操作。 |
cleaning up | 线程已经处理了一个命令,并且正在准备释放内存和重置某些状态变量。 |
closing tables | 线程将更改的表数据刷新到磁盘,并关闭已使用的表。这应该是一个快速的操作。如果没有,请确认您没有一个完整的磁盘,并且磁盘没有很重的使用。 |
converting HEAP to ondisk | 线程正在将一个内部临时表从一个存储器表转换成一个磁盘表。 |
copy to tmp table | 线程正在处理ALTER TABLE语句。这个状态发生在表之后,新的结构已经被创建,但是在行被复制到表之前。 对于处于这个状态的线程来说,Performance Schema可以用来获得复制操作的进度。 |
Copying to group table | 如果一个语句按照标准按不同的顺序排列,那么各行将按组排序并复制到一个临时表中。 |
Copying to tmp table | 服务器正在复制到内存中的临时表。 |
altering table | 服务器正在执行一个原位的ALTER TABLE。 |
Copying to tmp table on disk | 服务器正在复制到磁盘上的临时表。临时结果集变得太大了。因此,线程正在将临时表从内存中更改为基于磁盘的格式,以节省内存。 |
Creating index | 线程正在处理ALTER TABLE……启用MyISAM表的键。 |
Creating sort index | 线程正在处理使用内部临时表解析的SELECT。 |
creating table | 线程正在创建一个表。这包括创建临时表。 |
| 线程正在内存或磁盘上创建一个临时表。如果表是在内存中创建的,但是后来被转换成一个磁盘表,那么该操作期间的状态将会复制到磁盘上的tmp表。 |
committing alter table to storage engine | 服务器已经完成了一个就地修改表,并正在提交结果。 |
deleting from main table | 服务器正在执行一个多表删除的第一部分。它只从第一个表中删除,并保存列和偏移量,以便从其他(参考)表中删除。 |
deleting from reference tables | 服务器正在执行多表删除的第二部分,并从其他表中删除匹配的行。 |
discard_or_import_tablespace | 线程正在处理一个ALTER TABLE……丢弃表空间或ALTER TABLE……导入表空间中。 |
end | 这发生在最后,但是在ALTER TABLE,创建视图、删除、插入、选择或更新语句清理之前。 |
executing | 线程已经开始执行一个语句。 |
Execution of init_command | 线程在init_command系统变量的值中执行语句。 |
| 线程已经执行了一个命令。在这个状态下完成的一些物品的释放涉及到查询缓存。通常情况下,这个状态会被清理 |
FULLTEXT initialization | 服务器正准备执行自然语言全文搜索。 |
init | 这发生在ALTER TABLE的初始化之前,删除,插入,选择,或更新语句。服务器在这个状态下所采取的操作包括冲洗二进制日志、InnoDB日志和一些查询缓存清理操作。对于end状态,以下操作可能会发生: 1.在表格中的数据被更改后删除查询缓存条目 2.将事件写入二进制日志 3.释放内存缓冲区,包括blob |
Killed | 有人给线程发送了一个KILL语句,它应该在下一次检查KILL标志时终止。在MySQL的每个主要循环中都要检查国旗,但在某些情况下,线程可能需要很短的时间才能死。如果线程被其他线程锁定,那么当其他线程释放锁时,kill就会生效。 |
logging slow query | 线程正在为慢查询日志写一个语句。 |
login | 连接线程的初始状态,直到客户端成功验证为止。 |
manage keys | 服务器启用或禁用表索引。 |
NULL | z这个状态被用于SHOW PROCESSLIST状态。 |
opening tables | 线程正在尝试打开一个表。这应该是非常快的过程,除非有什么东西阻止打开。例如,ALTER TABLE或锁表语句可以防止在语句完成之前打开表。同样需要检查的是,您的table_open_cache值足够大。 |
optimizing | 服务器正在为一个查询执行初始优化 |
preparing | 这种状态发生在查询优化期间 |
Purging old relay logs | 线程正在删除不需要的中继日志文件 |
query end | 这个状态发生在处理一个查询之后,但是在释放项状态之前。 |
Receiving from client | 服务器正在读取客户端的数据包。这个状态被称为在MySQL 5.7.8之前的网络读取。 |
Removing duplicates | 该查询使用SELECT截然不同的方式,MySQL无法在早期阶段优化不同的操作。因此,MySQL需要一个额外的阶段来删除所有重复的行,然后将结果发送给客户端。 |
removing tmp table | 线程在处理一个SELECT语句后删除一个内部临时表。如果没有创建临时表,则不使用此状态 |
rename | 线程正在重命名一个表。 |
rename result table | 线程正在处理ALTER TABLE语句,创建了新表,并重新命名它来替换原来的表 |
Reopen tables | 线程为表获得了一个锁,但是在获得了底层表结构更改后的锁之后才注意到。它释放了锁,关闭了表,并试图重新打开它 |
Repair by sorting | 修复代码使用某种类型来创建索引。 |
preparing for alter table | 服务器正在准备执行一个就地修改表。 |
Repair done | 线程已经完成了一个MyISAM表的多线程修复。 |
Repair with keycache | 修复代码使用一个接一个地通过密钥缓存创建密钥。这比通过排序要慢得多。 |
Rolling back | 线程正在回滚事务。 |
Saving state | 对于MyISAM表操作,如修复或分析,线程正在将新表状态保存到.MYI文件头。状态包含诸如行数、自动递增计数器和键分布等信息 |
Searching rows for update | 线程正在做第一个阶段,在更新它们之前找到所有匹配的行。如果更新正在改变用于查找所涉及行的索引,那么就必须这样做 |
Sending data | 线程正在读取和处理SELECT语句的行,并将数据发送给客户机。因为在这个状态中发生的操作倾向于执行大量的磁盘访问(读取),所以它通常是给定查询的生命周期中最长的运行状态。 |
Sending to client | 服务器正在给客户端写一个数据包。 |
setup | 线程正在开始一个ALTER TABLE操作。 |
Sorting for group | 线程在做一个排序去优化group by操作 |
Sorting for order | 线程在做一个排序去优化order操作 |
Sorting index | 在MyISAM表优化操作期间,线程正在对索引页进行排序,以获得更高效的访问。 |
Sorting result | 对于SELECT语句,这类似于创建排序索引,但只是对于非临时表来说。 |
statistics | 服务器正在计算统计信息以开发一个查询执行计划。如果一个线程在这个状态中存在很长一段时间,那么服务器可能会执行其他工作。 |
System lock | mysql_lock_tables(),并且线程状态还没有被更新。这是一个非常普遍的状态,可能有很多原因。例如,线程将请求或正在等待表的内部或外部系统锁定。当InnoDB在执行锁表时等待表级锁时,就会发生这种情况。如果这个状态是由外部锁的请求引起的,并且您没有使用多个mysqld服务器访问相同的MyISAM表,那么您可以使用-skip-external锁定选项禁用外部系统锁。然而,外部锁定在缺省情况下是禁用的,因此该选项很可能不会产生任何影响。对于SHOW PROFILE,这个状态意味着螺纹请求锁(而不是等待它)。 |
update | 线程正在准备开始更新表。 |
Updating | 线程正在搜索要更新的行,并正在更新它们。 |
updating main table | 服务器正在执行多表更新的第一部分。它只更新第一张表,并保存列和偏移量,用于更新其他(参考)表。 |
updating reference tables | 服务器正在执行一个多表更新的第二部分,并更新来自其他表的匹配行。 |
User lock | 线程会请求或正在等待一个带有getlock()调用的咨询锁。对于SHOW PROFILE,这个状态意味着线程请求锁(而不是等待它)。 |
User sleep | 线程调用了SLEEP()调用。 |
Waiting for commit lock | FLUSH TABLES WITH READ LOCK 等待一个提交锁 |
Waiting for global read lock | FLUSH TABLES WITH READ LOCK 正在等待全局读锁,或者正在设置全局readonly系统变量。 |
| 该线程得到了一个通知,表明表的底层结构已经发生了变化,它需要重新打开表来获得新的结构。但是,要重新打开表,它必须等到所有其他线程都关闭了这个表。 如果另一个线程使用了刷新表或下面的表中的一个语句:刷新表tblname、ALTER TABLE、RENAME表、修理表、分析表或优化表,则会发出通知。 |
Waiting for table flush | 线程正在执行冲刷的表,并等待所有线程关闭它们的表,或者线程得到通知,表的底层结构发生了变化,它需要重新打开表格以获得新的结构。但是,要重新打开表,它必须等到所有其他线程都关闭了这个表。 如果另一个线程使用了冲刷表或下面的表中的一个语句:刷新表tblname、ALTER TABLE、RENAME表、修理表、分析表或优化表,则会发出通知。 |
Waiting for | 服务器正在等待从元数据锁定子系统获得一个THR_LOCL锁或锁,其中locktype表示锁的类型。 这个状态表示等待一个THR_LOCK锁: Waiting for table level lock 这些状态表示等待元数据锁:
|