在 MySQL 中使用 SHOW PROCESSLIST 语句显示连接列表

本文介绍了在 MySQL 中如何使用 SHOW PROCESSLIST 语句显示当前数据库服务器中所有的连接。

作为一个数据库管理员或者维护人员,您可能想了解当前数据库服务器的连接情况。因为连接过多可能会导致数据库服务器的宕机。

MySQL 提供了 SHOW PROCESSLIST 命令用来返回当前数据库服务器的所有的连接的信息,包括连接的 ID,用户,主机,数据库,时间和状态等。

MySQL 将当前服务器的所有的连接信息保存在 information_schema.processlist 表中,您还可以从此表查询所有的连接的信息。

实际上, SHOW PROCESSLIST 命令只是查询 information_schema.processlist 表的简写形式。

有时,您可能会收到 MySQL 服务器返回的“连接过多”错误。要找出原因,您可以使用 SHOW PROCESSLIST 命令获取当前所有的连接,并使用 KILL 语句终止空闲线程。

SHOW PROCESSLIST 语法

下面是 MySQL SHOW PROCESSLIST 命令的语法:

SHOW [FULL] PROCESSLIST;

FULL 是可选的,如果指定了 FULL,则返回的 Info 列中显示完整的语句,否则,只返回语句的前 100 个字符。

拥有 PROCESS 权限的账户可以查看当前的所有连接。否则,他们只能查看与其帐户关联的连接。

输出

SHOW PROCESSLIST 命令的输出由以下列组成:

ID
客户端进程的 ID
User
与线程关联的用户名。
Host
客户端连接的主机
db
如果选择了其他数据库,则为默认数据库,否则为 NULL
Command
命令类型
Time
当前线程处于当前状态的秒数。
State
线程状态,表示指示正在执行的线程的操作、事件或状态。
Info
正在执行的语句,或者 NULL 它没有执行任何语句。如果不在 SHOW PROCESSLIST 命令中使用 FULL 关键字,则在此列中仅返回每个语句的前 100 个字符。

SHOW PROCESSLIST 实例

让我们使用 root 用户运行以下 SHOW PROCESSLIST 语句:

SHOW PROCESSLIST;
+----+-----------------+---------------------+---------+---------+---------+------------------------+------------------+
| Id | User            | Host                | db      | Command | Time    | State                  | Info             |
+----+-----------------+---------------------+---------+---------+---------+------------------------+------------------+
|  5 | event_scheduler | localhost           | NULL    | Daemon  | 4141488 | Waiting on empty queue | NULL             |
| 27 | root            | 192.168.0.204:54690 | NULL    | Query   |       0 | starting               | SHOW PROCESSLIST |
| 28 | sqliz           | 192.168.0.204:54692 | sqlizdb | Sleep   |     247 |                        | NULL             |
+----+-----------------+---------------------+---------+---------+---------+------------------------+------------------+

这里, root 用户为超级用户并且拥有 PROCESS 权限,因此他能查看所有的连接。

让我们使用 sqliz 用户运行以下 SHOW PROCESSLIST 语句:

SHOW PROCESSLIST;
+----+-------+---------------------+---------+---------+------+----------+------------------+
| Id | User  | Host                | db      | Command | Time | State    | Info             |
+----+-------+---------------------+---------+---------+------+----------+------------------+
| 28 | sqliz | 192.168.0.204:54692 | sqlizdb | Query   |    0 | starting | SHOW PROCESSLIST |
+----+-------+---------------------+---------+---------+------+----------+------------------+

这里, sqliz 用户为欧通用户并且不具有 PROCESS 权限,因此他只能查看与他关联的连接。

从表中查询

MySQL 将当前服务器的所有的连接信息保存在 information_schema.processlist 表中。因此,您可以使用下面的语句从此表查询所有的连接的信息。

SELECT * FROM information_schema.processlist;
+----+-----------------+---------------------+---------+---------+---------+------------------------+----------------------------------------------+
| ID | USER            | HOST                | DB      | COMMAND | TIME    | STATE                  | INFO                                         |
+----+-----------------+---------------------+---------+---------+---------+------------------------+----------------------------------------------+
| 27 | root            | 192.168.0.204:54690 | NULL    | Query   |       0 | executing              | SELECT * FROM information_schema.processlist |
| 28 | sqliz           | 192.168.0.204:54692 | sqlizdb | Sleep   |      18 |                        | NULL                                         |
|  5 | event_scheduler | localhost           | NULL    | Daemon  | 4142731 | Waiting on empty queue | NULL                                         |
+----+-----------------+---------------------+---------+---------+---------+------------------------+----------------------------------------------+

结论

在本文中,您学习了获取 MySQL 数据库服务器的连接列表的两种方法:

  1. 使用 SHOW PROCESSLIST 命令
  2. information_schema.processlist 表中查询。