系统学习性,移步 IT-BLOG
show processlist
是显示用户正在运行的线程,需要注意的是,除了root
用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。除非单独个这个用户赋予了PROCESS
权限。
通常我们通过
top
检查发现mysqlCPU
或者iowait
过高 那么解决这些问题 都离不开show processlist
查询当前mysql
有些线程正在运行,然后分析其中的参数,找出那些有问题的线程,该kill
的kill
,该优化的优化!
注意: show processlist
只显示前100条 我们可以通过show full processlist
显示全部。
root
用户,可以看到全部线程运行情况
mysql> show processlist ;
+---------+-------------+---------------------+--------------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+---------+-------------+---------------------+--------------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
| 9801429 | lis | 10.41.7.10:57962 | lis | Query | 8 | Sending data | SELECT r.RgtantMobile, r.RgtantName, r.RgtNo, ag.SumGetMoney, ag.EnterAccDate, ag.BankAccNo, ( SELEC |
| 9802020 | ruihua | 10.41.5.6:37543 | sales_org | Sleep | 292 | | NULL |
| 9802070 | lis | 10.41.7.10:58998 | lis | Query | 8 | Sending data | select distinct d.contno,e.phone,d.appntidtype,d.appntidno,d.appntname,d.appntsex ,d.AppntBirthday,( |
| 9802084 | evoiceadmin | 10.41.8.8:41868 | evoicerh | Sleep | 57 | | NULL |
| 9802201 | root | 10.41.100.3:38976 | NULL | Query | 0 | init | show processlist |
+---------+-------------+---------------------+--------------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
148 rows in set (0.00 sec)
普通的lis
用户只能看到自己的
mysql> show processlist ;
+---------+-------------+---------------------+--------------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+---------+-------------+---------------------+--------------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
| 9801429 | lis | 10.41.7.10:57962 | lis | Query | 8 | Sending data | SELECT r.RgtantMobile, r.RgtantName, r.RgtNo, ag.SumGetMoney, ag.EnterAccDate, ag.BankAccNo, ( SELEC |
| 9802070 | lis | 10.41.7.10:58998 | lis | Query | 8 | Sending data | select distinct d.contno,e.phone,d.appntidtype,d.appntidno,d.appntname,d.appntsex ,d.AppntBirthday,( |
+---------+-------------+---------------------+--------------------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
单独给普通的activiti
用户授PROCESS
权限,(授权后需要退出重新登录)
show processlist
显示的信息都是来自MySQL
系统库information_schema
中的processlist
表。所以使用下面的查询语句可以获得相同的结果:
select * from information_schema.processlist
参数 | 含义 |
---|---|
Id | 登录mysql 后,系统分配的connection_id 表示线程的唯一标识,可以使用函数connection_id() 查看。当需要kill 一个语句的时候会用到。前面我们说了show processlist 显示的信息时来自information_schema.processlist 表,所以这个Id 就是这个表的主键。 |
User | 就是指启动这个线程的用户,如果是system user ,它是指由服务器产生的非客户线程,以在内部处理任务。这可能是复制从站或延迟行处理程序使用的I/O 或SQL 线程。unauthenticated user 指的是已经与客户端连接关联但是还没有完成客户机用户的认证的线程。event_scheduler 指的是监视预定事件的线程。如果是system user 那么在Host 列中不会指定主机 。 |
Host | 记录了发送请求的客户端的IP 和端口号。通过这些信息在排查问题的时候,我们可以定位到是哪个客户端的哪个进程发送的请求。 |
db | 当前执行的命令是在哪一个数据库上。如果没有指定数据库,则该值为 NULL 。 |
Command | 显示当前连接的执行的命令,一般就是休眠或空闲(sleep),查询(query),连接(connect)。这个很复杂,下面单独解释 |
Time | 表示该线程处于当前状态的时间,单位是秒。 |
State | 显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个 sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成 |
Info | 一般记录的是线程执行的语句。默认只显示前100个字符,也就是你看到的语句可能是截断了的,要看全部信息,需要使用 show full processlist。 |
参数 | 含义 |
---|---|
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 | 当线程创建表(包括内部临时表)时,会在创建表的函数的末尾创建。即使由于某些错误而无法创建表,也会使用此状态。 |
Analyzing | 线程正在计算MyISAM表密钥分布(例如:for ANALYZE TABLE)。 |
checking permissions | 线程正在检查服务器是否具有执行语句所需的权限。 |
Checking table | 线程正在执行表检查操作。 |
cleaning up | 线程已经处理了一个命令,正在准备释放内存并重置某些状态变量。 |
closing tables | 线程将更改的表数据刷新到磁盘并关闭已用表。这应该是一个快速的操作。如果没有,请验证您是否没有完整的磁盘,并且磁盘没有被非常大的使用。 |
copy to tmp table | 线程正在处理ALTER TABLE语句。此状态发生在已创建新结构的表之后,但是将行复制到该表之前。对于此状态的线程,可以使用性能模式来获取有关复制操作的进度。 |
Copying to group table | 如果语句具有不同ORDER BY和GROUP BY标准,各行按组排列和复制到一个临时表。 |
Creating index | 线程正在处理ALTER TABLE … ENABLE KEYS一个MyISAM表。 |
Creating sort index | 线程正在处理一个SELECT使用内部临时表解析的线程 。 |
creating table | 线程正在创建一个表,这包括创建临时表。 |
committing alter table to storage engine | 服务器已经完成就位ALTER TABLE并提交结果。 |
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语句。 |
executing | 该线程已经开始执行一个语句。 |
Execution of init_command | 线程正在init_command系统变量的值中执行语句 。 |
freeing items | 线程已经执行了一个命令,在这种状态下完成的项目的一些释放涉及查询缓存,这个状态通常在后面cleaning up。 |
FULLTEXT initialization | 服务器正在准备执行自然语言全文搜索。 |
init | 此操作在初始化ALTER TABLE, DELETE, INSERT, SELECT, or UPDATE之前发生,服务器在该状态中采取的操作包括刷新二进制日志、Innodb日志和一些查询缓存清理操作。对于最终状态, 可能会发生以下操作 |
Killed | 执行KILL语句,向线程发送了一个声明,下次检查kill标志时应该中断。在MySQL的每个主循环中检查该标志,但在某些情况下,线程可能需要很短时间才能死掉。如果线程被某个其他线程锁定,则一旦其他线程释放锁定,该kill就会生效。 |
Locking system tables | 线程正在尝试锁定系统表(例如,时区或日志表)。 |
login | 连接线程的初始状态,直到客户端成功认证为止。 |
manage keys | 服务器启用或禁用表索引。 |
NULL | 该状态用于SHOW PROCESSLIST状态。 |
Opening system tables | 线程尝试打开系统表(例如,时区或日志表)。 |
Opening tables | 线程正在尝试打开一个表,这应该是非常快的程序,除非有事情阻止打开。例如,一个ALTER TABLE或一个LOCK TABLE语句可以阻止打开一个表,直到语句完成。还可能需要关注table_open_cache参数的值是否足够大。对于系统表,使用Opening system tables状态。 |
optimizing | 服务器正在执行查询的初始优化。 |
preparing | 此状态发生在查询优化期间。 |
Purging old relay logs | 线程正在删除不需要的中继日志文件。 |
query end | 处理查询之后,freeing items状态之前会发生这种状态。 |
Removing duplicates | 该查询的使用SELECT DISTINCT方式使得MySQL不能在早期阶段优化不同的操作。因此,MySQL需要一个额外的阶段来删除所有重复的行,然后将结果发送给客户端。 |
removing tmp table | 处理语句后,该线程正在删除一个内部临时表SELECT 。如果没有创建临时表,则不使用该状态。 |
rename | 线程正在重命名一个表。 |
rename result table | 线程正在处理一个ALTER TABLE语句,已经创建了新表,并重新命名它来替换原始表。 |
Reopen tables | 线程获得了表的锁,但在获得基础表结构更改的锁之后注意到。它释放了锁,关闭了table,并试图重新打开它。 |
Repair by sorting | 修复代码正在使用排序来创建索引。 |
preparing for alter table | 服务器正在准备就地执行ALTER TABLE。 |
Repair done | 线程已经完成了一个MyISAM表的多线程修复 。 |
Repair with keycache | 修复代码通过密钥缓存逐个使用创建密钥,这比慢得多Repair by sorting。 |
Rolling back | 线程正在回滚事务。 |
Saving state | 对于MyISAM表操作(如修复或分析),线程将新的表状态保存到.MYI文件头。状态包括行数, AUTO_INCREMENT计数器和键分布等信息。 |
Searching rows for update | 线程正在进行第一阶段,以便在更新之前查找所有匹配的行。如果UPDATE要更改用于查找涉及的行的索引,则必须执行此操作 。 |
setup | 线程正在开始一个ALTER TABLE操作。 |
Sorting for group | 线程正在做一个满足一个GROUP BY。 |
Sorting for order | 线程正在做一个满足一个ORDER BY。 |
Sorting index | 线程是排序索引页,以便在MyISAM表优化操作期间更有效地访问。 |
Sorting result | 对于一个SELECT语句,这类似于Creating sort index,但是对于非临时表。 |
statistics | 服务器正在计算统计信息以开发查询执行计划。如果一个线程长时间处于这种状态,服务器可能是磁盘绑定的,执行其他工作。 |
update | 线程正在准备开始更新表。 |
Updating | 线程正在搜索要更新的行并正在更新它们。 |
updating main table | 服务器正在执行多表更新的第一部分,它仅更新第一个表,并保存用于更新其他(引用)表的列和偏移量。 |
updating reference tables | 服务器正在执行多表更新的第二部分,并从其他表更新匹配的行。 |
User lock | 线程将要求或正在等待通过GET_LOCK()呼叫请求的咨询锁定 。因为 SHOW PROFILE,这个状态意味着线程正在请求锁定(不等待它)。 |
User sleep | 线程调用了一个 SLEEP()调用。 |
参数 | 含义 |
---|---|
logging slow query | 线程正在向慢查询日志写入语句。 |
altering table | 服务器正在执行就地ALTER TABLE。 |
Receiving from client | 服务器正在从客户端读取数据包。 |
Copying to tmp table | 服务器正在复制磁盘到内存的临时表,是直接在磁盘创建的临时表而并非从内存转到磁盘的临时表。 |
Copying to tmp table on disk | 对于线程将临时表从内存中更改为基于磁盘的格式存储以节省内存后,又把临时表从磁盘复制到内存时的状态。 |
Creating tmp table | 线程正在内存或磁盘上创建临时表。如果表在内存中创建,但后来转换为磁盘表,则该操作中的状态将为Copying to tmp table on disk。 |
Sending data | 线程正在读取和处理SELECT语句的行,并将数据发送到客户端。由于在此状态期间发生的操作往往执行大量的磁盘访问(读取),所以在给定查询的整个生命周期内通常是最长的运行状态。 |
Sending to client | 服务器正在向客户端写入数据包。 |
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或下面的语句之一 |
Waiting for table flush | 线程正在执行FLUSH TABLES并正在等待所有线程关闭它们的表,或者线程得到一个通知,表中的底层结构已经改变,并且需要重新打开表以获得新的结构。但是,要重新打开表,必须等到所有其他线程都关闭该表。如果另一个线程已使用FLUSH TABLES或下面的语句之一 |
Waiting for lock_type lock | 服务器正在等待THR_LOCK从元数据锁定子系统获取锁或锁,其中lock_type指示锁的类型。THR_LOCK状态表示 |
Writing to net | 服务器正在将数据包写入网络,如果一个线程长时间在执行并且一直处于Writing to net状态,那么一直在发送数据包到网络,可以试着调整max_allowed_packet大小。另外,这可能会导致其他线程大量阻塞。 |
Waiting on cond | 线程等待条件成为true的一般状态,没有特定的状态信息可用。 |
System lock | 线程已经调用mysql_lock_tables() ,且线程状态从未更新。这是一个非常普遍的状态,可能由于许多原因而发生。例如, 线程将请求或正在等待表的内部或外部系统锁。当InnoDB在执行锁表时等待表级锁时, 可能会发生这种情况。如果此状态是由于请求外部锁而导致的,并且不使用正在访问相同表的多个mysqld服务器MyISAM,则可以使用该–skip-external-locking选项禁用外部系统锁 。但是,默认情况下禁用外部锁定,因此这个选项很有可能不起作用。因为SHOW PROFILE,这个状态意味着线程正在请求锁定(不等待它)。对于系统表,使用Locking system tables状态。 |
参数 | 含义 |
---|---|
checking privileges on cached query | 服务器正在检查用户是否具有访问缓存查询结果的权限。 |
checking query cache for query | 服务器正在检查当前查询是否存在于查询缓存中。 |
invalidating query cache entries | 查询缓存条目被标记为无效,因为底层表已更改。 |
sending cached result to client | 服务器正在从查询缓存中获取查询的结果,并将其发送给客户端。 |
storing result in query cache | 服务器将查询结果存储在查询缓存中。 |
Waiting for query cache lock | 当会话正在等待采取查询缓存锁定时,会发生此状态。这种情况可能需要执行一些查询缓存操作,如使查询缓存无效的INSERT或DELETE语句,以及RESET QUERY CACHE等等。 |
这些状态适用于事件调度程序线程,创建用于执行调度事件的线程或终止调度程序的线程。
参数 | 含义 |
---|---|
Clearing | 调度程序线程或正在执行事件的线程正在终止,即将结束。 |
Initialized | 调度程序线程或将执行事件的线程已初始化。 |
Waiting for next activation | 调度程序具有非空事件队列,但下一次激活是将来。 |
Waiting for scheduler to stop | 线程发出SET GLOBAL event_scheduler=OFF并正在等待调度程序停止。 |
Waiting on empty queue | 调度程序的事件队列是空的,它正在休眠。 |
以下列表显示了主从复制中主服务器的Binlog Dump
线程的State
列中可能看到的最常见状态(SHOW PROCESSLIST)。如果Binlog Dump
线程在主服务器上看不到,这意味着复制没有运行,也就是说,目前没有连接任何Slave
主机。
参数 | 含义 |
---|---|
Sending binlog event to slave | 二进制日志由各种事件组成,一个事件通常为一个更新加一些其它信息。线程已经从二进制日志读取了一个事件并且正将它发送到从服务器。 |
Finished reading one binlog; switching to next binlog | 线程已经读完二进制日志文件并且正打开下一个要发送到从服务器的日志文件。 |
Has sent all binlog to slave; waiting for binlog to be updated | 线程已经从二进制日志读取所有主要的更新并已经发送到了从服务器。线程现在正空闲,等待由主服务器上新的更新导致的出现在二进制日志中的新事件。 |
Waiting to finalize termination | 线程停止时发生的一个很简单的状态。 |
参数 | 含义 |
---|---|
Connecting to master | 线程正试图连接主服务器。 |
Checking master version | 建立同主服务器之间的连接后立即临时出现的状态。 |
Registering slave on master | 建立同主服务器之间的连接后立即临时出现的状态。 |
Requesting binlog dump | 建立同主服务器之间的连接后立即临时出现的状态。线程向主服务器发送一条请求,索取从请求的二进制日志文件名和位置开始的二进制日志的内容。 |
Waiting to reconnect after a failed binlog dump request | 如果二进制日志转储请求失败(由于没有连接),线程进入睡眠状态,然后定期尝试重新连接。可以使用–master-connect-retry选项指定重试之间的间隔。 |
Reconnecting after a failed binlog dump request | 线程正尝试重新连接主服务器。 |
Waiting for master to send event | 线程已经连接上主服务器,正等待二进制日志事件到达。如果主服务器正空闲,会持续较长的时间。如果等待持续slave_read_timeout秒,则发生超时。此时,线程认为连接被中断并企图重新连接。 |
Queueing master event to the relay log | 线程已经读取一个事件,正将它复制到中继日志供SQL线程来处理。 |
Waiting to reconnect after a failed master event read | 读取时(由于没有连接)出现错误,线程企图重新连接前将睡眠master-connect-retry秒。 |
Reconnecting after a failed master event read | 线程正尝试重新连接主服务器,当连接重新建立后,状态变为Waiting for master to send event。 |
Waiting for the slave SQL thread to free enough relay log space | 正使用一个非零relay_log_space_limit值,中继日志已经增长到其组合大小超过该值。I/O线程正等待直到SQL线程处理中继日志内容并删除部分中继日志文件来释放足够的空间。 |
Waiting for slave mutex on exit | 线程停止时发生的一个很简单的状态。 |
参数 | 含义 |
---|---|
Reading event from the relay log | 线程已经从中继日志读取一个事件,可以对事件进行处理了。 |
Has read all relay log; waiting for the slave I/O thread to update it | 线程已经处理了中继日志文件中的所有事件,现在正等待I/O线程将新事件写入中继日志。 |
Waiting for slave mutex on exit | 线程停止时发生的一个很简单的状态。 |
这些线程状态发生在复制从库上,但与连接线程相关联,而不与I/O
或SQL
线程相关联。
参数 | 含义 |
---|---|
Changing master | 线程正在处理CHANGE MASTER TO语句。 |
Killing slave | 线程正在处理STOP SLAVE语句。 |
Opening master dump table | 此状态发生在Creating table from master dump之后。 |
Reading master dump table data | 此状态发生在Opening master dump table之后。 |
Rebuilding the index on master dump table | 此状态发生在Reading master dump table data之后。 |