MySQL performance_schema.setup_consumers 怎样开启长语句历史
如果你想在 MySQL 中保留最近一段时间执行过的 SQL,重点不是直接查询 events_statements_history_long,而是先打开对应的 consumer。最小配置通常是把 events_statements_history_long 设为 YES,同时确认上游的全局、线程和当前语句消费者没有关闭。
官方地址:https://dev.mysql.com/doc/refman/8.4/en/performance-schema-setup-consumers-table.html
这张表保存的是跨线程、已经结束的最近语句事件;它是一个有限窗口,不是永久 SQL 日志。窗口满了以后,旧行会被新行淘汰,所以“查不到”不一定代表语句没有执行。
一、先分清 current、history 和 history_long
Performance Schema 的语句事件可以按三个观察范围理解:
events_statements_current:关注每个线程当前正在处理的语句。events_statements_history:保留每个线程最近结束的一小段语句历史。events_statements_history_long:把所有线程已经结束的语句汇总到一个全局的长历史窗口。
因此,history_long 适合回答“刚才有哪些线程执行过什么语句”,不适合替代慢查询日志、审计日志或永久业务流水。官方文档还说明,这张表没有索引,读取时要控制返回列和时间范围。

二、检查 setup_consumers 的上游开关
先看当前配置,不要直接修改:
SELECT NAME, ENABLED -- 只查看消费者开关,先确认采集链路是否被上游截断 FROM performance_schema.setup_consumers WHERE NAME IN ( 'global_instrumentation', 'thread_instrumentation', 'events_statements_current', 'events_statements_history', 'events_statements_history_long' ) ORDER BY FIELD( NAME, 'global_instrumentation', 'thread_instrumentation', 'events_statements_current', 'events_statements_history', 'events_statements_history_long' );
这里最容易忽略的是层级关系:上游 consumer 为 NO 时,下层即使写成 YES 也不能产生预期采集结果。实务上至少要确认:
global_instrumentation为YES,否则整体监控链路可能关闭。thread_instrumentation为YES,否则线程级语句事件不会按预期采集。events_statements_current为YES,再看 history 与 history_long 的开关。
如果只是临时观察 SQL,通常不必把所有 waits、stages 和 transactions 的历史都一起打开。先打开语句这一条链路,范围更容易控制。
三、动态开启 events_statements_history_long
setup_consumers.ENABLED 可以修改。只打开全局语句长历史时,可以执行:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' -- 只打开跨线程的语句长历史,避免把其它事件历史一起扩大 WHERE NAME = 'events_statements_history_long'; SELECT NAME, ENABLED -- 立即回读目标开关,确认修改落在正确的 consumer 上 FROM performance_schema.setup_consumers WHERE NAME = 'events_statements_history_long';
官方文档说明,对 setup_consumers 的修改会立即影响监控。不过“立即生效”只表示新的采集配置开始参与判断,不会把开启前已经结束的语句补写回历史表。
如果需要按线程保留短历史,可以单独打开 events_statements_history;如果只关心所有线程的最近事件,则保持 history_long 为 YES,并结合容量和查询范围使用。
四、设置容量并读取最近语句
events_statements_history_long 保存最近的全局语句事件。N 的默认值由服务器启动时自动调整;要明确设置容量,应使用启动参数 performance_schema_events_statements_history_long_size,改完后按实例的发布流程重启。
读取时优先选出结束时间、线程、摘要和耗时字段:
SELECT THREAD_ID,
EVENT_NAME,
SQL_TEXT,
TIMER_START,
TIMER_END,
ROWS_EXAMINED,
ROWS_AFFECTED
-- 只取最近结束的语句,避免无索引历史表返回过多列
FROM performance_schema.events_statements_history_long
WHERE SQL_TEXT IS NOT NULL
ORDER BY TIMER_END DESC
LIMIT 100;
这张表记录的是已经结束的语句事件,并且是跨线程的全局窗口。窗口满后,插入新事件会淘汰最旧的行;容量越小,越容易在排查前被后续流量覆盖,容量越大则要结合实例资源和监控成本评估。

五、为什么打开后仍然查不到语句
| 现象 | 优先检查 | 原因边界 |
|---|---|---|
| 目标 consumer 是 YES,但没有新记录 | 检查上游 global/thread/current 开关 | 上游关闭会让下层设置失去作用 |
| 刚执行的语句不在表中 | 确认语句已经结束 | 事件结束前不会进入 history_long |
| 稍早的语句消失了 | 查看最近写入量和容量 | 全局窗口满后会淘汰最旧行 |
| SQL_TEXT 为空或结果不完整 | 检查查询列和事件类型 | 不要把历史表当作完整审计记录 |
还有一个常见误区:把查询历史表本身当作“打开开关后自动拥有过去记录”。consumer 只影响之后的事件采集,历史数据不会凭空回填;如果需要长期留存,应使用更适合持久化的日志或监控链路。
六、一个可复用的最小操作顺序
- 查询
setup_consumers,确认上游开关。 - 只把
events_statements_history_long改为YES。 - 执行一组目标 SQL,再查询长历史表。
- 按实例流量设置启动时容量,不把它当成永久存储。
- 排查时先区分“未结束、被截断、被淘汰、列筛选”四类原因。
常见问题
只开启 events_statements_history_long 就够了吗?
不一定。要先确认上游消费者和线程级采集没有关闭;层级上的 NO 可能让下层设置不产生效果。
history_long 是不是永久 SQL 记录?
不是。它只保存有限数量的最近已结束语句,容量满后会淘汰旧行,也不应该替代审计或慢查询日志。
修改 setup_consumers 需要重启吗?
消费者表的修改会立即影响监控;但 history_long 的明确容量通常通过启动参数设置,容量调整要按实例流程重启。
MySQL JSON_CONTAINS_PATH 怎样判断 JSON 路径是否存在
- 上一篇
- MySQL JSON_CONTAINS_PATH 怎样判断 JSON 路径是否存在
- 下一篇
- MySQL optimizer hint 怎样临时禁止索引合并
-
- 数据库 · MySQL | 43分钟前 |
- MySQL 锁等待超时怎样定位阻塞事务
- 325浏览 收藏
-
- 数据库 · MySQL | 44分钟前 | MySQL · mysql 时区 STR_TO_DATE 日期时间 CONVERT_TZ
- MySQL STR_TO_DATE 怎样处理带时区的日期字符串
- 117浏览 收藏
-
- 数据库 · MySQL | 50分钟前 | MySQL · 数据校验 · mysql IPv6 INET6_ATON INET6_NTOA VARBINARY
- MySQL INET6_ATON 怎样把 IPv6 文本转成二进制
- 207浏览 收藏
-
- 数据库 · MySQL | 53分钟前 |
- MySQL JSON_SCHEMA_VALID 怎样校验 JSON 文档
- 331浏览 收藏
-
- 数据库 · MySQL | 58分钟前 |
- MySQL DECLARE HANDLER 怎样只处理 NOT FOUND 条件
- 160浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_GeomFromText 怎样把 WKT 文本转成空间对象
- 339浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL WITH ROLLUP 怎样生成小计和总计
- 107浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL REGEXP_LIKE 怎样判断字符串是否匹配正则
- 108浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL 派生表为什么阻止索引下推
- 412浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL optimizer hint 怎样临时禁止索引合并
- 325浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL JSON_CONTAINS_PATH 怎样判断 JSON 路径是否存在
- 399浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 851次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 855次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 936次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 910次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 739次使用
-
- MySQL JSON_TABLE 展开数组时如何保留缺失字段
- 2026-09-10 501浏览
-
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 2026-08-30 501浏览
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览

