MySQL慢查询日志怎么开:阈值、阈值与磁盘占满风险(2026)
摘要:站点变慢时先别急着加配置。按 MySQL 8.4 / MariaDB 官方文档,写清 slow_query_log 怎么开、long_query_time 怎么设、日志轮转与磁盘占满风险,以及怎么核对是否在记。只放官网普通链接。查询日期 2026-11-02。
依据:MySQL 8.4 Reference Manual · The Slow Query Log、MySQL · Password Logging;MariaDB · Slow Query Log Overview、Rotating Logs on Unix and Linux。查询日期:2026-11-02(北京时间)。只放官网普通链接(
affiliate_later);不写云厂商单价、不硬推联盟;菜单与路径以你机器发行版为准。
后台打开一篇文章要等好几秒,或 CPU 被 mysqld 顶满。云盘快照和逻辑备份到对象存储解决的是「坏了能回」,慢查询日志解决的是「哪条 SQL 拖慢」。默认多数发行版关着慢查询日志;乱开会把磁盘写满。本文只收窄到:怎么开、阈值怎么设、怎么轮转、怎么核对是否在记。
一、慢查询日志记什么
MySQL 手册写明:慢查询日志记录执行时间超过 long_query_time 秒、且至少检查了 min_examined_row_limit 行的语句,用来找优化候选。默认:
- 关闭(
slow_query_log/ MariaDB 10.11+ 亦称log_slow_query为 0) long_query_time默认 10 秒(可带小数到微秒级)- 输出目标由
log_output决定(常见FILE;也可TABLE) - 默认文件名多为
主机名-slow.log,落在数据目录,除非你给绝对路径
MariaDB 文档额外提醒:查询里若含密码,慢日志也可能留下敏感信息;慢日志/通用日志不像二进制日志那样内置加密,文件要放安全位置或依赖文件系统加密。


二、先核对当前是否已开
在库里执行(只读):
SHOW GLOBAL VARIABLES LIKE 'slow_query_log%';
SHOW GLOBAL VARIABLES LIKE 'long_query_time';
SHOW GLOBAL VARIABLES LIKE 'log_output';
SHOW GLOBAL VARIABLES LIKE 'min_examined_row_limit';
通过标准:
slow_query_log=ON(或 MariaDB 新名log_slow_query= 1)才算开着。log_output含FILE时,才会往slow_query_log_file继续写语句;若是NONE,即使开关为 ON 也不记查询。- 记下
slow_query_log_file的绝对/相对路径,后面用ls -lh看体积。
三、怎么开启与设置阈值(运行时 + 持久化)
仅当前到下次重启(MySQL / 多数 MariaDB 仍认这些名):
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 2; -- 秒;个人站可先 1~2,再按噪音调
SET GLOBAL log_output = 'FILE';
-- 可选:指定文件(目录须 mysqld 可写)
-- SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
MariaDB 10.11+ 文档优先写 log_slow_query / log_slow_query_time / log_slow_query_file,旧名多半仍是别名;以 SHOW VARIABLES 实际名为准。
写进配置文件(示例,改完需重启或按发行版要求生效):
[mysqld]
# MySQL 8.4 常见写法;MariaDB 可用 [mariadb] 段
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_output = FILE
# 可选:不记索引的查询会让日志暴涨,先别默认打开
# log_queries_not_using_indexes = 0
MariaDB 官方轮转文档示例把日志放到 /var/log/mysql/,并配合 long_query_time=5。路径不存在时先建目录并给运行用户写权限,否则开关开了文件也写不进去。
阈值怎么选:
| 场景 | 建议起点 | 风险 |
|---|---|---|
| 个人 WordPress / 低流量 | 1~2 秒 | 噪音少,可能漏中等慢查询 |
| 默认官方 | 10 秒 | 只抓极端慢句 |
long_query_time=0 或再开「无索引也记」 | 排查短时用 | 日志与磁盘 I/O 易暴涨 |
MySQL 手册还说明:获取初始锁的时间不计入执行时间;语句在执行完、锁释放后才写入,故日志顺序可能与执行顺序不同。
四、怎么核对「真的在记」
- 再跑一遍第二节的
SHOW GLOBAL VARIABLES,确认ON+FILE+ 阈值。 - 短时测试(勿在生产高峰、勿对业务库乱
SLEEP):把会话阈值临时降到 1,执行一条明显超过阈值的只读语句,再看日志文件mtime与末尾是否出现# Query_time:。MariaDB 文档示例用SELECT SLEEP(11);再查mysql.slow_log(TABLE输出时)或读文件。 - 文件输出时,条目前常见
#头字段:Query_time、Lock_time、Rows_sent、Rows_examined;MySQL 还可开log_slow_extra追加更多字段。 - 汇总可用官方工具:
mysqldumpslow(MySQL)/mariadb-dumpslow(MariaDB),避免直接人肉翻巨型文件。 - 测完把阈值改回合理值;会话级
SET SESSION slow_query_log=0可临时关闭当前连接日志(MariaDB 文档写明任意用户可对连接关闭)。
五、日志轮转与磁盘占满风险
慢查询日志默认不会像 binary log 那样自带 expire;文件可以一直长。风险点:
- 数据盘写满 → InnoDB 无法写 redo / 站点 500;比「少记几条慢 SQL」严重得多。
log_queries_not_using_indexes=ON且阈值很低 → 日志每分钟暴增(MySQL 可用log_throttle_queries_not_using_indexes限流;MariaDB 有log_slow_rate_limit)。- 日志与数据同盘、又没监控 → 发现时往往已经只剩几十 MB。
落地习惯:
# 看体积与 inode(路径换成你的 slow_query_log_file)
ls -lh /var/log/mysql/*slow*
df -h /var/log /var/lib/mysql
Unix/Linux 上 MariaDB 文档推荐用发行版 logrotate 轮转慢日志(见 Rotating Logs on Unix and Linux):按日/按大小切分、压缩旧文件、保留有限份数。轮转后若 mysqld 仍握着旧句柄,需按发行版文档 FLUSH SLOW LOGS 或等价操作让进程改写新文件(具体命令以你版本手册为准)。

运维上再配一条:磁盘使用率告警(本站有站点巡检与告警核对思路可借鉴)。备份策略仍走逻辑备份,不要把未轮转的巨型 slow.log 当备份塞进对象存储。
六、和宝塔 / 面板的关系
若用宝塔等面板,界面里可能有「慢查询日志」开关,底层仍是上述变量。改面板前先 SHOW VARIABLES 看当前值,避免面板与手改 my.cnf 互相覆盖。面板利弊见宝塔面板要不要装。
相关阅读
- MariaDB/MySQL 逻辑备份到对象存储:mysqldump、压缩与保留策略
- 宝塔面板要不要装:优缺点与安全注意
- 网站可用性监测:HTTP/SSL 告警清单
- WordPress 禁用 wp-cron 改系统 cron:积压怎么核对
官方来源与查询日期
- MySQL 8.4 · The Slow Query Log
- MariaDB · Slow Query Log Overview
- MariaDB · Rotating Logs on Unix and Linux
- 查询日期:2026-11-02(北京时间)。
风险提示:在生产库改全局变量前先确认从库/只读副本策略;日志可能含敏感 SQL。本文不构成托管或安全合规审计意见。