暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

show processlist 获取方式的 SQL 最大长度/show processlist 实现

00后DBA实录 2025-02-13
54

前言

不知不觉已经 2025 了,23年8月参加工作以来已经 1 年多了,也是公众号创建第117天,大家新年快乐,最近工作比较忙,更新频率降低一些哈,有空就更。

今天简单聊聊 mysql 进程列表的获取方式的 SQL 最大长度问题,话不多说,直接开始测试

show [full] processlist

第一个先看看 show processlist
 ,这个方式是进程数比较少的时候最好用的方式。

show processlist
 有两种语法:

show processlist
show full processlist

如果没有 FULL
 关键字,SHOW PROCESSLIST
 只会在 Info
 字段中显示每个语句的前 100 个字符

生成 100 个字符

root@localhost [(none)] 22:38:43 > SELECT SUBSTRING(REPEAT(MD5(RAND()),5), 1100);
+------------------------------------------------------------------------------------------------------+
| SUBSTRING(REPEAT(MD5(RAND()),5), 1, 100)                                                             |
+------------------------------------------------------------------------------------------------------+
| 187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d |
+------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

再开一个会话看看能不能显示完全:

root@localhost [(none)] 22:38:44 > show processlist;
+----+-----------------+-----------+------+---------+--------+------------------------+------------------------------------------------------------------------------------------------------+
| Id | User            | Host      | db   | Command | Time   | State                  | Info                                                                                                 |
+----+-----------------+-----------+------+---------+--------+------------------------+------------------------------------------------------------------------------------------------------+
|  5 | event_scheduler | localhost | NULL | Daemon  | 458029 | Waiting on empty queue | NULL                                                                                                 |
| 13 | root            | localhost | NULL | Query   |      8 | User sleep             | select '187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b98 |
| 14 | root            | localhost | NULL | Query   |      0 | init                   | show processlist                                                                                     |
+----+-----------------+-----------+------+---------+--------+------------------------+------------------------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)

显然并不能。我们再看看 show full processlist;

root@localhost [(none)] 22:41:12 > show full processlist;
+----+-----------------+-----------+------+---------+--------+------------------------+--------------------------------------------------------------------------------------------------------------------------+
| Id | User            | Host      | db   | Command | Time   | State                  | Info                                                                                                                     |
+----+-----------------+-----------+------+---------+--------+------------------------+--------------------------------------------------------------------------------------------------------------------------+
|  5 | event_scheduler | localhost | NULL | Daemon  | 458142 | Waiting on empty queue | NULL                                                                                                                     |
| 13 | root            | localhost | NULL | Query   |      2 | User sleep             | select '187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d3402a690443c0bc597cd0b987dc4187d',sleep(100) |
14 | root            | localhost | NULL | Query   |      0 | init                   | show full processlist                                                                                                    |
+----+-----------------+-----------+------+---------+--------+------------------------+--------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

这下可以了。

下面看看 show processlist
 获取进程列表的实现方式:

介绍一个 performance_schema_show_processlist 变量:

SHOW PROCESSLIST
 语句通过收集所有活动线程的线程数据来提供 process 信息。performance_schema_show_processlist
 变量决定使用哪个 SHOW PROCESSLIST
 实现:

  • 默认为 OFF ,实现在 thread manager 内遍历活动线程,同时持有 global mutex。这会产生负面的性能后果,尤其是在繁忙的系统上。
  • 设置为 ON 时,SHOW PROCESSLIST
     实现基于 Performance Schema processlist
     表。此实现从 Performance Schema 而不是 thread manager 查询活动线程数据,并且不需要 mutex,虽然 mutex 是轻量级的但是线程多的时候也会导致性能抖动。

但是需要额外的配置:有关配置的注意事项参考:https://dev.mysql.com/doc/refman/8.0/en/performance-schema-processlist-table.html

最低要求配置:

  • MySQL 服务器必须在启用线程检测的情况下进行配置和构建。默认情况下是这样;它是使用 DISABLE_PSI_THREAD
     CMake选项控制的。
  • Performance Schema 必须在服务器启动时启用。默认情况下是这样;它是使用 performance_schema
     系统变量控制的。

如果满足了这些配置要求, performance_schema_show_processlist
 会启用或禁用替代的 SHOW PROCESSLIST
 实现。如果不满足最低配置,则processlist
 表(以及SHOW PROCESSLIST
)可能不会返回所有数据。

总结

简单描述了 show processlist
 的最大字符长度和 show processlist
 获取进程列表的实现方式。

往期回顾


感谢阅读!关注我获取更多精彩内容。


文章转载自00后DBA实录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论