Skip to content
xiaoboluo768 edited this page Jun 11, 2020 · 19 revisions

附录A 线程状态信息详解

  • 线程的状态可以通过SHOW PROCESSLIST语句进行查看,输出结果中显示了哪些线程正在运行(您还可以通过查询INFORMATION_SCHEMA PROCESSLIST表或mysqladmin processlist命令获取此信息)
    • 如果用户具有PROCESS权限,则可以查看所有用户的线程。否则,您只能看到当前用户自己的线程(即与您使用的MySQL帐户相关联的线程)。
    • 如果不使用FULL关键字,每个语句只显示前100个字符在info字段中。
  • 也可以从performance_schema.threads表中获取进程信息(前提是参数performance_schema设置为ON,表示开启performance_schema功能)。对于次表的访问,不需要互斥量,且对服务器性能的影响最小。 (INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST语句会有一定的性能影响,因为它们需要互斥量。),另外,此表除了查看show processlist中的线程信息外,还可以查看后台线程的信息(INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST不能查看后台线程信息)。这意味着此表可以用于监视其他线程信息来源不能查看的一些后台线程活动信息。
  • SHOW PROCESSLIST语句是非常有用的,如果你遇到“many connections”错误信息,并想知道发生了什么。 MySQL保留一个额外的连接以供具有SUPER权限的帐户使用,以确保管理员始终能够连接和检查系统(前提是您没有向所有用户授予此权限)
  • show processlist查看到的线程可以用KILL语句杀死。
  • 下面是SHOW PROCESSLIST输出的示例:
root@localhost Tue Mar 14 00:14:06 2017 00:14:06 [(none)]>show full processlist\G;
*************************** 1. row ***************************
     Id: 4
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: starting
   Info: show full processlist
1 row in set (0.00 sec)
  • show processlist 输出字段含义详解
    • Id:连接进程标识符。这与在INFORMATION_SCHEMA.PROCESSLIST表的ID列,performance_schema.threads表的PROCESSLIST_ID列中显示的值是相同的值,都是由CONNECTION_ID()函数返回的值
    • User:执行语句的MySQL用户名称。如果显示的是“system user”,它指的是由服务器生成的非客户端线程正在执行内部任务。例如主备复制中从库上使用的I/O或SQL线程或延迟行处理程序的线程。“unauthenticated user”指的是已经建立客户端连接但是还没有对客户端连接的用户进行客户端用户的认证的线程。 “event_scheduler”是指监视计划任务调度事件的线程。对于“system user”,在Host列中显示为Null值
    • Host:执行语句的客户端的主机名(除了没有主机信息的“system user”之外)。 SHOW PROCESSLIST的Host列以host_name:client_port格式显示TCP/IP连接的主机名,以便更容易确定哪个客户端正在做什么事情
    • Db:客户端连接的默认数据库(如果连接时指定了库名),否则显示为NULL值
    • Command:线程正在执行的命令的类型。此列的值对应于C/S协议和Com_xxx状态变量的COM_xxx命令。
    • Time:线程处于当前状态的时间数(以秒为单位)。对于从库SQL线程,该值是最后复制事件的时间戳和从库的实际时间之间的秒数(也可以理解为事件等待的时间)
    • State:提示线程正在做什么样的操作,事件或状态。大多数状态所对应于的操作都执行的非常快。如果线程停留在某个状态很长时间,则表名该线程可能执行过程中碰到了某个问题,需要进行排查。对于SHOW PROCESSLIST语句,State列的值始终为NULL
    • Info:线程正在执行的语句,如果没有执行任何语句,则显示为NULL。语句可以是发送到服务器的语句,或者如果语句内部调用执行其他语句,即指的最内层调用的语句。例如,如果CALL语句调用存储过程,而存储过程中执行SELECT语句,则Info值将显示存储过程中的SELECT语句

1. 线程的Command值有如下值

2. 普通线程状态

3. Query Cache Thread States

4. Replication Master Thread States

5. Replication Slave I/O Thread States

6. Replication Slave SQL Thread States

7. Replication Slave Connection Thread States

8. Event Scheduler Thread States

Clone this wiki locally