MySQL · 实时会话解析

命令

  • show processlist,查看正在运行的线程,列出前 100 条
  • show full processlist,列出所有正在运行的线程

解析

1
2
3
4
5
6
7
8
9
10
mysql> show processlist;
+--------+---------+--------------------+--------------------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+---------+--------------------+--------------------+---------+------+----------+------------------+
| 106125 | tdmsdev | 10.153.96.89:56808 | tdm | Sleep | 597 | | NULL |
| 106134 | tdmsdev | 10.153.96.89:56827 | tdm | Sleep | 596 | | NULL |
| 106178 | hdm | 10.133.0.53:60606 | information_schema | Sleep | 4 | | NULL |
| 106179 | sre | localhost | NULL | Query | 0 | starting | show processlist |
+--------+---------+--------------------+--------------------+---------+------+----------+------------------+
4 rows in set (0.00 sec)
  • Id:线程标识,kill 某线程时使用
  • User:显示当前用户,也就是执行 SQL 语句的用户
  • Host:显示执行 SQLIP 和端口,可以用来追踪问题的来源
  • db:显示该线程连接的是哪个数据库
  • Command:显示当前执行的命令,一般:Sleep 休眠,Query 查询,Connect 连接,Binlog Dump 复制
  • Time:会话持续时间,单位(秒)
  • State:显示使用当前连接的状态,很重要列。请注意,State 只是语句执行中的某一个状态,以查询为例,需要经过 copying to tmp table,sorting result,sending data 等状态才算完成。
  • Info:显示执行的 SQL 语句,判断问题的重要依据。

State

  • Sleeping:已处理完,正在等待客户端发送新请求。
  • Sending data:线程正在处理 select 语句,并将数据发送到客户端。由于在此状态期间发生的操作往往会执行大量磁盘访问(读取),因此它通常是给定查询生命周期中运行时间最长的状态,属于慢查询。
  • Creating tmp table:正在创建临时表以存放部分查询结果。
  • Copying to tmp table on disk:由于临时结果集大于 tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存,可以通过变量 tmp_table_sizemax_heap_table_size 来控制内存表大小上限。
  • Waiting for table flush:线程正在执行 flush tables 并且正在等待所有线程关闭它们的表。但是,要重新打开表,它必须等到所有其他线程关闭了相关表。
  • Writing to net:服务器正在将数据包写入网络。
  • Killed:通常发送了一个 kill 请求给某线程,某些情况下,线程可能仍然需要很短的时间才能死掉,如果线程被某个其他线程锁定,则一旦另一个线程释放其锁定,kill 就会马上生效。
  • System lock:正在等待取得一个外部的系统锁。如果当前没有运行多个 mysqld 服务同时请求同一个表,那么可以通过增加 --skip-external-locking 参数来禁止外部系统锁。

官方参考