簡體   English   中英

mysql 5.7:為什么慢查詢日志中缺少38%的查詢?

[英]mysql 5.7: Why are 38% of queries missing from the slow query log?

偶爾,我們會看到每秒show global status like "Queries"成千上萬的查詢,這些查詢是通過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     |
+---------------+-------+

請注意,對全局變量的更改不會被現有會話繼承。

會話在會話啟動時會創建全局變量的副本,並且該會話在會話的生存期內不會重新復制全局變量。 因此,如果會話的壽命相對較長,則有些會話不會“聽到”它們應該記錄其緩慢的查詢。 確保所有會話都注意新的全局設置的唯一方法是使它們重新連接並開始新的會話。

其他一些答案建議啟用常規查詢日志,但是如果會話壽命很長並且不知道全局配置選項的更改,這將無濟於事。 這些會話也不會啟用常規查詢日志。

Percona Server實現了配置選項slow_query_log_use_global_control,以使會話將全局選項用於某些查詢日志選項。 但是此功能在MySQL中不存在。

我實現了一個類似於您的enableLog.pl的腳本。 它在這里:

手冊

服務器不會將查詢緩存處理的查詢寫入慢速查詢日志,也不會因為表有零行或一行而無法從索引的存在中受益。

檢查查詢緩存為多少查詢提供服務

SHOW STATUS LIKE 'Qcache%';

尋找Qcache_hits。 您還可以檢查GLOBAL值。

  • 在此處閱讀有關查詢緩存的更多信息

如果您想知道,請同時打開慢速查詢日志(如所述)和同一腳本中的“常規日志”。 並排比較以查看慢速查詢日志中“丟失”的通用日志正在做的事情將是真正容易的。

請記住在會話結束時關閉常規日志,以免填滿存儲設備。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM