Mysql出现问题:慢查询日志失效解决方案(mysql 小虚竹)
问题
在线动态设置long_query_time,从10秒设置到了1秒,执行慢sql,没有记录到慢查询日志中。
解决方案
查看慢查询日志是否有开启
show variables like '%slow_query_log%';
show variables like '%long_query_time%';
是已经开启的。如果没有开启,请按上文介绍的方式操作,这里不再赘述。
慢查询阀值是10s,改为1s.
SET GLOBAL long_query_time = 1;
修改之后,建议重新开一个会话查询(旧会话查询出的值可能是原来的10s)
扩展
其它可能失效的原因
慢查询日志失效原因二:未使用索引的 SQL 记录不会写入慢查询日志
查看设置,默认是关闭的。
show variables like 'log_queries_not_using_indexes';
查看慢查询日志是否有开启
show variables like '%slow_query_log%';
show variables like '%long_query_time%';
是已经开启的。如果没有开启,请按上文介绍的方式操作,这里不再赘述。
测试sql
检查student 表的索引:
show index from student;
执行没有使用索引的sql:
select *
from student
where student_name ='student_name446741'
慢查询日志中,并没有记录到。
使用索引的 SQL 记录写入慢查询日志:
set global log_queries_not_using_indexes=on;
再执行慢查询的sql
select *
from student
where student_name ='student_name446741'
没有索引的数据也添加到慢查询日志了。
注:log_queries_not_using_indexes参数要跟参数log_throttle_queries_not_using_indexes配合使用
log_throttle_queries_not_using_indexes:该参数决定每分钟记录未使用索引的SQL的数量上限,因为未使用索引的SQL可能会非常多,导致慢日志空间增长飞快。
慢查询日志失效原因三:慢sql里有锁等待
慢SQL里有大量锁等待,慢SQL的执行时间不包含锁等待的时间
慢查询日志失效原因四:默认不记录管理类命令的慢sql
log_slow_admin_statements=0,因此alter, create index, analyze table等操作即使超过 long_query_time,也不会记录到慢日志中。
log_slow_admin_statements 该参数决定是否记录管理类的命令,有 ALTER TABLE,ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE,REPAIR TABLE,默认是不记录这一类语句到慢日志。
慢查询日志失效原因五:min_examined_row_limit为非0
min_examined_row_limit 该参数定义一个SQL所读取的数据行数;
min_examined_row_limit设置为非0值,SQL检查行数未超过该值,也不会记录。
默认值为0
慢查询日志失效原因六:slow log文件句柄发生了变化
slow log文件钻句柄发生了变化,如运行期间用vim打开log,最后又保存退出,此时文件句柄发生变化,需要执行flush slow logs。
慢查询日志失效原因七:从库的复制语句默认不记录
log_slow_slave_statements:该参数在从库上设置,决定是否记录在复制过程中超过long_query_time的SQL,如果binlog格式是row,则即使开启了该参数,也不会记录相关SQL。
除非binlog格式是statement且开启log_slow_slave_statements。
参考
- 点赞
- 收藏
- 关注作者
评论(0)