[英]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的腳本。 它在這里:
如果您想知道,請同時打開慢速查詢日志(如所述)和同一腳本中的“常規日志”。 並排比較以查看慢速查詢日志中“丟失”的通用日志正在做的事情將是真正容易的。
請記住在會話結束時關閉常規日志,以免填滿存儲設備。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.