启用mariadb慢查询日志需显式开启:默认off,可通过set global slow_query_log = 1临时启用,或在my.cnf的[mysqld]段添加slow_query_log = 1并重启服务;同时须正确配置slow_query_log_file路径权限、long_query_time阈值(新连接生效),并确保日志格式完整以防mysqldumpslow解析失败。

如何启用MariaDB慢查询日志(slow_query_log)
慢查询日志默认是关闭的,必须显式启用才能记录执行超时的SQL。不改配置文件或不执行SET GLOBAL命令,slow_query_log始终为OFF。
- 确认当前状态:连接MariaDB后运行
SHOW VARIABLES LIKE 'slow_query_log';,返回OFF说明未启用 - 临时启用(立即生效,重启失效):
SET GLOBAL slow_query_log = 1; - 永久启用:编辑配置文件(如
/etc/mysql/mariadb.conf.d/50-server.cnf或/etc/my.cnf),在[mysqld]段下添加:slow_query_log = 1<br>slow_query_log_file = /var/log/mysql/slow-query.log
- 注意:修改配置后必须重启MariaDB服务(
sudo systemctl restart mariadb),否则不生效
设置long_query_time阈值要注意什么
long_query_time决定“多慢才算慢”,单位是秒,支持小数(如0.5),但它的行为受microsecond精度影响——MariaDB实际按微秒截断比较,所以设成0.1可能漏掉部分毫秒级慢查询。
- 默认值是
10,生产环境建议调低到2或1,避免遗漏真实性能问题 - 动态修改(无需重启):
SET GLOBAL long_query_time = 2;,但该值只对新连接生效;已有连接仍沿用旧值 - 若同时开启
log_queries_not_using_indexes = 1,哪怕查询快于long_query_time,只要没走索引也会被记录——这容易让日志爆炸,慎开
日志路径权限和轮转怎么配才不出错
写入失败是慢日志最常见静默失效原因:MariaDB以mysql用户身份运行,但配置的slow_query_log_file路径若属主不是mysql、或目录无写权限,日志就完全不会生成,且错误通常只出现在error.log里,不易察觉。
- 创建日志目录并授权:
sudo mkdir -p /var/log/mysql<br>sudo chown mysql:mysql /var/log/mysql<br>sudo chmod 755 /var/log/mysql
- 确保配置中路径结尾**不要带空格或特殊字符**,例如
/var/log/mysql/slow.log可行,但/var/log/mysql/slow query.log会导致启动失败 - 配合
logrotate防磁盘打满:在/etc/logrotate.d/mariadb中加入/var/log/mysql/slow-query.log条目,并在postrotate里加mysqladmin flush-logs,否则轮转后MariaDB仍往旧文件句柄写
为什么mysqldumpslow解析结果为空
常见原因是日志格式被破坏:MariaDB慢日志每条记录以# Time:开头,如果手动清空日志文件(> /var/log/mysql/slow-query.log)或用echo追加内容,会删掉头部时间戳标记,导致mysqldumpslow无法识别结构。
- 安全清空方式:
sudo truncate -s 0 /var/log/mysql/slow-query.log(保留文件inode和权限) - 验证格式是否正常:用
head -n 5 /var/log/mysql/slow-query.log,应看到类似# Time: 260614 2:15:33的行 - 若日志已损坏,
mysqldumpslow会静默跳过整条记录,输出0 queries却不报错——这是最容易被忽略的陷阱
配置慢日志真正生效的关键不在参数本身,而在路径权限、格式完整性和日志轮转衔接这三个环节。少一个,都可能让你以为“开了日志”,其实一条都没记进去。











