最近在使用mysql慢日志的过程中发现即使慢sql的时间已经设置为1秒,但是小于1秒的sql依然被输出到了慢日志文件中,先说原因:启用了 log_queries_not_using_indexes
如果你在配置中开启了
log_queries_not_using_indexes = on
那么 即使查询执行时间远小于 long_query_time,只要它没走索引,也会被记入慢日志!
解决方法
检查是否启用了该选项:
show variables like 'log_queries_not_using_indexes';
如果返回 on,而你不希望记录未使用索引但很快的查询,请关闭它:
set global log_queries_not_using_indexes = off;
并在配置文件中确保:
[mysqld] log_queries_not_using_indexes = 0
变量作用域
如果上面的配置依然无法解决问题,检查long_query_time 设置未全局生效(会话 vs 全局),执行
show session variables like 'long_query_time';
如果不是1(需要设置的时间),执行
set global long_query_time = 1;
注意:set global 只影响新建立的连接,不影响已有连接。
查询变量值
经过上面的配置后,查询变量是否生效,执行
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、在线开启
-- 尝试设置日志文件路径(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),需要重启
[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、在线开启),但下次启动时会沿用配置。
到此这篇关于解决mysql慢日志输出问题的文章就介绍到这了,更多相关mysql慢日志输出内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论