首页/数据/数据库速查/慢日志落库(log_output=TABLE)与轮转
性能与调优57 条

慢日志落库(log_output=TABLE)与轮转

log_output=TABLE 把慢日志写进 mysql.slow_log 表:可用 SQL 直接聚合;FILE 则要处理轮转(mv 后 FLUSH)。两种模式可兼得(TABLE,FILE)。

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

慢日志落库与轮转是什么

log_output 决定慢日志的落地位置:写文件(FILE)或写进 mysql.slow_log 表(TABLE),两者可以同时开启('TABLE,FILE')。落库的好处是可以直接用 SQL 聚合、排序、统计语句模板,不需要先把日志文件解析成表;代价是写入开销略高、表会持续增长。选文件模式则必须自己处理轮转:改名前先想想 mysqld 的文件句柄,只 mv 不刷新会让进程继续写旧文件。

基本信息

落库配置SET GLOBAL log_output = 'TABLE'
文件配置SET GLOBAL log_output = 'FILE'(默认)
双写SET GLOBAL log_output = 'TABLE,FILE'
长查询阈值long_query_time,默认 10 秒,可按业务调整
轮转文件模式改名后执行 FLUSH SLOW LOGS(或 mysqladmin flush-logs)

典型使用场景

  • 慢查询 TopN 统计:直接在 mysql.slow_log 上按 query_time 排序取头部
  • 语句模板聚合:按 sql_text 前缀或摘要把同类慢查询归并,定位共性问题
  • 临时排查:开启慢日志并调低阈值,抓一段时间的高频慢语句
  • 容量与索引评估:结合 rows_examined 判断是否存在大范围扫描
  • 长期留存:文件模式配合日志轮转与归档,落库模式适合短期密集分析

落库与查询

落库与查询
-- 切到落库模式,便于直接用 SQL 查询
SET GLOBAL log_output = 'TABLE';
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1;   -- 排查期临时调低阈值
SELECT COUNT(*) AS total FROM mysql.slow_log;
SELECT sql_text, query_time, rows_examined, rows_sent
FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;
-- 排查结束后恢复原阈值,避免长期开销
SET GLOBAL slow_query_log = OFF;
SET GLOBAL long_query_time = 10;

文件模式轮转

文件模式轮转
# 先改名,再通知 mysqld 重新打开日志文件
mv /var/log/mysql/slow.log /var/log/mysql/slow.log.$(date +%F)
mysqladmin -uroot -p flush-logs
# 等价 SQL:FLUSH SLOW LOGS;
# 落库模式下清理历史记录(表会持续增长)
mysql -uroot -p -e "TRUNCATE TABLE mysql.slow_log;"

两种模式对比

维度TABLEFILE
查询方式直接用 SQL 聚合需解析文件或导入后分析
写入开销略高,写表有额外代价较低
增长管理表会膨胀,需定期清理需要日志轮转与归档
适合场景短期密集分析长期留存与外部日志平台
mysql.slow_log 本身也是一张表:长期堆积会占用大量空间并拖慢相关查询,落库模式要配套清理策略或改用双写加文件归档。
long_query_time 支持小数(如 0.5 秒),排查期适当调低能捕捉更多候选语句;生产长期保持过低阈值会让日志量失控,应设置阈值后尽快恢复。

易错点

  • 文件模式下只改名不刷日志:mysqld 继续往旧文件句柄写,新文件长期为空,看起来像「慢日志没生成」
  • 落库模式长期不清理:mysql.slow_log 持续膨胀,占用空间并影响查询,需要定期清理或切换模式
  • 把监控查询直接打向慢日志表:高频扫描该表会带来额外锁与 IO 压力,监控应低频聚合或读取归档数据
  • 排查结束后忘记恢复阈值与开关:长期开着低阈值慢日志,日志量与写入开销持续存在
  • 只看 query_time 忽略 rows_examined:慢日志的核心信息是扫描行数与返回行数的比例,只看耗时容易误判优化方向

数据来源与参考

  • MySQL 8.0 Reference Manual: log_output
  • MySQL 8.0 Reference Manual: FLUSH LOGS

相关工具

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