首页/数据/数据库速查/慢查询日志与通用日志开启

慢查询日志与通用日志开启

slow log 记录超过 long_query_time 的语句(性能分析必开);general log 记录每一条到达服务端的语句,仅短时排障用。

数据库速查数据更新于 2026-10-13

慢查询日志与通用日志是什么

慢查询日志记录执行时间超过 long_query_time 的语句,是性能分析和慢 SQL 治理的必备开关;通用日志记录每一条到达服务端的语句(含明文 SQL),写放大明显,只适合短时排障。两者都由 log_output 决定写文件还是写 mysql 库的表,动态开启无需重启。

基本信息

慢日志开关slow_query_log 与 long_query_time
通用日志开关general_log,开销大,用完即关
输出方式log_output 为 FILE 或 TABLE
记录补充log_queries_not_using_indexes 会记录未走索引的语句
分析工具pt-query-digest、mysqldumpslow 聚合统计

典型使用场景

  • 定位慢 SQL:按耗时排序找出需要优化的语句
  • 上线审核:新功能上线后观察是否引入新的慢查询
  • 锁与临时表分析:结合慢日志中的统计字段定位原因
  • 复现线上语句:短时开启通用日志抓取完整请求序列
  • 定期汇总:按周聚合慢日志,跟踪 Top 语句变化
  • 诊断连接问题:通用日志能确认语句是否真的到达服务端

动态开启与配置文件

动态开启与配置文件
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;          -- 超过 1 秒即记录
SET GLOBAL log_output = 'TABLE';         -- 输出到 mysql.slow_log
SELECT start_time, query_time, sql_text FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
-- 排障用通用日志(用完立刻关闭)
SET GLOBAL general_log = ON;
SET GLOBAL general_log = OFF;
-- 配置文件方式(输出到文件)
-- [mysqld]\n-- slow_query_log = 1\n-- slow_query_log_file = /var/log/mysql/slow.log\n-- long_query_time = 1\n-- log_queries_not_using_indexes = 0\n-- log_output = FILE

两类日志对照

维度慢查询日志通用日志
记录范围超过阈值的语句每一条到达服务端的语句
开销较低,可按阈值控制很高,写放大明显
适用时长可长期开启仅短时排障
输出方式FILE 或 TABLEFILE 或 TABLE
主要用途性能分析与治理确认请求是否到达与顺序
general log 含明文 SQL 与敏感数据且写放大明显;log_queries_not_using_indexes 在小表查询多的实例上也会刷爆日志。
解析慢日志会消耗额外 IO 与 CPU,线上长期把 long_query_time 设得过低(例如 0.01 秒)会让日志文件快速膨胀并挤占磁盘;建议先用 0.1 到 1 秒观察,再结合聚合工具收敛。
把慢日志接入采集体系比人工翻文件更有效:定期解析后沉淀成 Top 语句清单,并持续跟踪它们的耗时变化,治理才算形成闭环。

易错点

  • 通用日志开着忘记关闭,磁盘被迅速写满导致实例不可写
  • long_query_time 设得过低,慢日志文件暴涨且难以人工阅读
  • 慢日志只记录不分析,文件堆积数月无人处理
  • 输出到 TABLE 却从不清理 mysql.slow_log,库表持续膨胀
  • 开 log_queries_not_using_indexes 又忽略小表查询,日志被无意义的语句淹没

数据来源与参考

  • MySQL 8.0 Reference Manual: The Slow Query Log

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌