MariaDB 慢查询日志配置 long_query_time 不生效为什么?

文章导读
MariaDB 慢查询日志配置 long_query_time 不生效,最常见原因是慢查询日志总开关 slow_query_log 处于关闭状态,或者变量作用域 SESSION 与 GLOBAL 设置不一致。检查日志文件写入权限和 min_examined_row_limit 限制也能解决大部分问题。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
A A

MariaDB 慢查询日志配置 long_query_time 不生效,最常见原因是慢查询日志总开关 slow_query_log 处于关闭状态,或者变量作用域 SESSION 与 GLOBAL 设置不一致。检查日志文件写入权限和 min_examined_row_limit 限制也能解决大部分问题。

先说结论:确认 slow_query_log 已开启,区分 SESSION 与 GLOBAL 作用域,并验证日志文件权限。

  • 先确认:检查 slow_query_log 变量值是否为 ON 或 1。
  • 先处理:根据需求设置 GLOBAL 或 SESSION 级别的 long_query_time。
  • 再验证:执行超时查询语句并查看日志文件是否有新记录。

命令速用版

以下命令用于快速检查状态和临时开启日志,重启后失效:

SHOW VARIABLES LIKE 'slow_query_log';

SET GLOBAL slow_query_log = 'ON';

SET GLOBAL long_query_time = 1;

SHOW VARIABLES LIKE 'slow_query_log_file';

为什么会这样

long_query_time 不生效的核心原因是慢查询日志总开关未打开,或变量作用域设置未匹配当前会话。

MariaDB 中 long_query_time 仅当 slow_query_log 启用时才参与判断。若总开关关闭,即使查询时间超过阈值也不会记录。此外,SESSION 级别的设置仅影响当前连接,GLOBAL 级别的设置影响新连接,混淆两者会导致配置看似未生效。

分步处理

按顺序检查开关、时间阈值、文件路径和权限,确保配置链路完整。

1. 确认日志开关状态:执行 SHOW VARIABLES LIKE 'slow_query_log';,确保 Value 为 ON 或 1。

MariaDB 慢查询日志配置 long_query_time 不生效为什么?

2. 确认时间阈值:执行 SHOW VARIABLES LIKE 'long_query_time';,确认数值符合预期(单位秒)。

3. 确认日志文件路径:执行 SHOW VARIABLES LIKE 'slow_query_log_file';,记录文件绝对路径。

4. 检查文件权限:在操作系统层面确认 mysql 用户对该路径有写入权限,避免 Permission denied。

怎么验证是否生效

通过执行故意超时的查询语句,检查日志文件是否新增记录。

1. 设置 long_query_time 为 1 秒。

2. 执行 SELECT SLEEP(2); 语句。

3. 查看慢查询日志文件末尾,确认是否出现该语句的执行记录。

4. 若日志无变化,检查错误日志 error log 是否有写入报错。

常见坑

注意 MariaDB 特有的过滤变量和管理员语句排除规则,避免误判配置失效。

MariaDB 慢查询日志配置 long_query_time 不生效为什么?

1. min_examined_row_limit:若设置该值,扫描行数低于限制的查询即使超时也可能不记录。

2. log_slow_filter:该变量可过滤特定类型的查询,配置不当会拦截日志。

3. 管理员语句:部分管理命令默认不记录到慢查询日志,需检查 log_slow_admin_statements 设置。

4. 动态生效范围:SET GLOBAL 不影响已建立的连接,需重新登录会话验证。

常见问题

修改 long_query_time 后为什么当前会话没变化?

因为变量作用域是 GLOBAL,当前会话仍沿用旧值。

需要断开重连或针对当前会话执行 SET SESSION long_query_time = 值。

日志文件为空但错误日志有报错怎么办?

通常是 mysql 用户对日志文件路径没有写入权限。

使用 chown 或 chmod 修正文件所属用户和权限。

微秒级查询能否被记录?

默认 long_query_time 精度为秒,微秒级需配合 use_microseconds 配置。

MariaDB 10.5+ 支持更细粒度,但需确认版本特性。