解决MySQL慢日志输出问题

最近在使用MySQL慢日志的过程中发现即使慢SQL的时间已经设置为1秒,但是小于1秒的SQL依然被输出到了慢日志文件中,先说原因:启用了 log_queries_not_using_indexes

如果你在配置中开启了

bash 复制代码
log_queries_not_using_indexes = ON

那么 即使查询执行时间远小于 long_query_time,只要它没走索引,也会被记入慢日志!

解决方法

检查是否启用了该选项:

bash 复制代码
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';

如果返回 ON,而你不希望记录未使用索引但很快的查询,请关闭它:

bash 复制代码
SET GLOBAL log_queries_not_using_indexes = OFF;

并在配置文件中确保:

bash 复制代码
[mysqld]
log_queries_not_using_indexes = 0

变量作用域

如果上面的配置依然无法解决问题,检查long_query_time 设置未全局生效(会话 vs 全局),执行

bash 复制代码
SHOW SESSION VARIABLES LIKE 'long_query_time';

如果不是1(需要设置的时间),执行

bash 复制代码
SET GLOBAL long_query_time = 1;

注意:SET GLOBAL 只影响新建立的连接,不影响已有连接。

查询变量值

经过上面的配置后,查询变量是否生效,执行

bash 复制代码
SHOW GLOBAL VARIABLES LIKE 'long_query_time';
SHOW SESSION VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'slow_query_log_file';

开启慢日志

1、在线开启

bash 复制代码
-- 尝试设置日志文件路径(MySQL 8.0 支持动态修改,5.7 可能不支持)
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';

-- 记录超过 1 秒的查询
SET GLOBAL long_query_time = 1;

SET GLOBAL slow_query_log = 'ON';

虽然在线开启了,但 MySQL 重启后会恢复默认。要永久生效,需用到下面的方法。

2、修改配置文件,编辑 my.cnf(通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf),需要重启

bash 复制代码
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 0  # 可选:是否记录未使用索引的查询

修改后无需立即重启(需先执行1、在线开启),但下次启动时会沿用配置。

相关推荐
ma_king1 小时前
入门 java 和 数据库
java·数据库·后端
jiayou645 小时前
KingbaseES 实战:审计追踪配置与运维实践
数据库
随风飘的云5 小时前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
二流小码农7 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少7 小时前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker7 小时前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋8 小时前
Android 协程时代,Handler 应该退休了吗?
android
NineData16 小时前
NineData 迁移评估功能正式上线
数据库·dba
火柴就是我21 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
NineData1 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算