MySQL5.7:为什么慢查询日志中有38%的查询丢失了?

hsgswve4  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(456)

我们偶尔会看到 show global status like "Queries" 但是在启用了所有功能的慢速查询日志中看不到它们,所以我们看不到这些查询是什么。
如果我想查看慢速查询日志中的所有内容,以下是(我认为是)相关的全局变量:

log_queries_not_using_indexes   ON
log_slow_admin_statements   ON
log_slow_slave_statements   ON
log_throttle_queries_not_using_indexes  0
long_query_time 0.000000
min_examined_row_limit  0
slow_launch_time    2
slow_query_log  ON
slow_query_log_file /tmp/slow.log

在5分钟内,mysql全局状态变量 Questions 报告90433个查询,但慢日志中只有56479个查询。丢失的33954个(38%)查询在哪里?
我用一个 enableLog.pl 设置上述变量5分钟,然后将其还原为原始值的脚本:


# mysql --login-path=cm -Ee 'show  global status like "Queries"' && rm -rf /tmp/slow.log && ./enableLog.pl --duration 5m /tmp/slow.log && mysql --login-path=cm -Ee 'show  global status like "Queries"'

***************************1. row***************************

Variable_name: Queries
        Value: 73570440
11:41:51: logging for 00:05:00 until 11:46:51
... ending

***************************1. row***************************

Variable_name: Queries
        Value: 73660873

# perl -E 'say 73660873-73570440'

90433

# grep '^# Time: ' /tmp/slow.log | wc -l

56479

# perl -E 'say 90433-56479'

33954

# perl -E 'say +(90433-56479)/90433'

0.375460285515243

在enablelog.pl运行时,以下是(相关)全局变量:


# mysql --login-path=cm -e 'show global variables;' | egrep '^(slow_|log_|min_)'

log_bin OFF
log_bin_basename    
log_bin_index   
log_bin_trust_function_creators OFF
log_bin_use_v1_row_events   OFF
log_builtin_as_identified_by_password   OFF
log_error   /var/log/mysql/error.log
log_error_verbosity 3
log_output  FILE
log_queries_not_using_indexes   ON
log_slave_updates   OFF
log_slow_admin_statements   ON
log_slow_slave_statements   ON
log_syslog  OFF
log_syslog_facility daemon
log_syslog_include_pid  ON
log_syslog_tag  
log_throttle_queries_not_using_indexes  0
log_timestamps  UTC
log_warnings    2
long_query_time 0.000000
min_examined_row_limit  0
slow_launch_time    2
slow_query_log  ON
slow_query_log_file /tmp/slow.log

# mysql --version

mysql  Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using  EditLine wrapper

此外,它们不是查询缓存命中:


# mysql --login-path=cm -e 'SHOW GLOBAL STATUS LIKE "Qcache_hits";'

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Qcache_hits   | 0     |
+---------------+-------+
epfja78i

epfja78i1#

请注意,对全局变量的更改不会被现有会话继承。
会话在会话启动时复制全局变量,并且会话在会话的生存期内不会重新复制全局变量。因此,如果会话的寿命相对较长,有些人就不会“听说”他们应该记录他们缓慢的查询。确保所有会话都遵循新的全局设置的唯一方法是使它们重新连接并启动新会话。
其他一些答案建议启用常规查询日志,但是如果会话是长期的,并且不知道全局配置选项的更改,那么这将没有帮助。这些会话也不会启用常规查询日志。
percona服务器实现了一个配置选项slow\u query\u log\u use\u global\u control,使会话对某些查询日志选项使用global选项。但是mysql没有这个功能。
我实现了一个类似于enablelog.pl的脚本。在这里:
代码:https://github.com/billkarwin/bk-tools/blob/master/full-slow-log
手册:https://github.com/billkarwin/bk-tools/blob/master/doc/full-slow-log.rst

kyvafyod

kyvafyod2#

当您想知道时,请同时打开慢速查询日志(如上所述)和同一脚本中的常规日志。并排比较将非常容易看到常规日志正在做什么,而慢速查询日志中缺少什么。
记住,在会话结束时关闭常规日志,以避免填满存储设备。

jmp7cifd

jmp7cifd3#

根据手册:
服务器不会将查询缓存处理的查询写入慢速查询日志,也不会将由于表中没有行或只有一行而无法从索引中获益的查询写入慢速查询日志。
检查查询缓存使用

SHOW STATUS LIKE 'Qcache%';

寻找qcache\u点击率。也可以检查全局值。
请在此处阅读有关查询缓存的详细信息

相关问题