MySQL 5.7如何记录达到max_execution_time阈值被终止的查询?
MySQL 5.7中获取因max_execution_time终止的查询方法
官方原生方案
- 利用Performance Schema
MySQL 5.7默认启用Performance Schema,其中events_statements_history和events_statements_history_long表会记录所有执行过的语句,包括被max_execution_time终止的查询(这类查询的sql_killed_by_timeout字段会标记为1)。可以用以下SQL筛选目标记录:
SELECT sql_text, timer_start, timer_end, sql_killed_by_timeout FROM performance_schema.events_statements_history WHERE sql_killed_by_timeout = 1 UNION ALL SELECT sql_text, timer_start, timer_end, sql_killed_by_timeout FROM performance_schema.events_statements_history_long WHERE sql_killed_by_timeout = 1;
注意:这两张表的存储条数有限,若需要留存更多历史记录,可以调整performance_schema_events_statements_history_size和performance_schema_events_statements_history_long_size配置参数,避免新记录覆盖旧数据。
- 检查错误日志
当查询因超时被终止时,MySQL错误日志(默认文件名为[主机名].err)会生成包含Query execution was interrupted, maximum statement execution time exceeded的日志条目,里面附带具体SQL语句和客户端连接信息。直接搜索该关键词就能定位到目标查询。
Percona工具方案
Percona Server慢查询日志扩展
如果使用的是Percona Server 5.7(而非原生MySQL),可以通过以下配置让超时终止的查询写入慢查询日志:- 开启
log_slow_admin_statements和log_slow_slave_statements参数 - 设置
slow_query_log_always_write_time = 0,强制将超时查询记录到慢日志 - 额外开启
log_query_timeout参数,专门记录超时终止的查询
- 开启
pt-kill实时监控记录
pt-query-digest无法直接解析这类超时记录,但可以用pt-kill实时监控并记录即将被终止的查询。将--busy-time设置为和max_execution_time一致的阈值,命令示例:
pt-kill --match-command Query --busy-time 60 --print --kill --log /var/log/pt-kill-timeout.log
该命令会把符合超时条件的查询打印并记录到指定日志文件,同时终止查询。
内容的提问来源于stack exchange,提问作者Baptiste Mille-Mathias
相关产品推荐
相关产品推荐

