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