0
点赞
收藏
分享

微信扫一扫

MySQL慢查询日志失效原因:七种失效场景


问题

在线动态设置long_query_time,从10秒设置到了1秒,执行慢sql,没有记录到慢查询日志中。

解决方案

查看慢查询日志是否有开启

show variables like '%slow_query_log%'; 
show variables like '%long_query_time%';

MySQL慢查询日志失效原因:七种失效场景_SQL

MySQL慢查询日志失效原因:七种失效场景_慢查询_02

是已经开启的。如果没有开启,请按上文介绍的方式操作,这里不再赘述。
慢查询阀值是10s,改为1s.

SET GLOBAL long_query_time = 1;

修改之后,建议重新开一个会话查询(旧会话查询出的值可能是原来的10s)

MySQL慢查询日志失效原因:七种失效场景_数据库_03

其它可能失效的原因

慢查询日志失效原因二:未使用索引的 SQL 记录不会写入慢查询日志

查看设置,默认是关闭的。

show variables like 'log_queries_not_using_indexes';

MySQL慢查询日志失效原因:七种失效场景_mysql_04

查看慢查询日志是否有开启

show variables like '%slow_query_log%'; 
show variables like '%long_query_time%';

MySQL慢查询日志失效原因:七种失效场景_SQL

MySQL慢查询日志失效原因:七种失效场景_sql_06

是已经开启的。如果没有开启,请按上文介绍的方式操作,这里不再赘述。

测试sql
检查student 表的索引:

show index from student;

执行没有使用索引的sql:

select *
from student
where student_name ='student_name446741'

MySQL慢查询日志失效原因:七种失效场景_sql_07

慢查询日志中,并没有记录到。

MySQL慢查询日志失效原因:七种失效场景_数据库_08

使用索引的 SQL 记录写入慢查询日志:

set global log_queries_not_using_indexes=on;

MySQL慢查询日志失效原因:七种失效场景_慢查询_09

再执行慢查询的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,默认是不记录这一类语句到慢日志。

MySQL慢查询日志失效原因:七种失效场景_sql_10

慢查询日志失效原因五:min_examined_row_limit为非0

min_examined_row_limit 该参数定义一个SQL所读取的数据行数;

min_examined_row_limit设置为非0值,SQL检查行数未超过该值,也不会记录。

默认值为0

MySQL慢查询日志失效原因:七种失效场景_SQL_11

慢查询日志失效原因六: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。

links:
https://blog.51cto.com/u_14122613/5735627


举报

相关推荐

0 条评论