1. 程式人生 > >MySQL 慢查詢日誌(Slow Query Log)

MySQL 慢查詢日誌(Slow Query Log)

    同大多數關係型資料庫一樣,日誌檔案是MySQL資料庫的重要組成部分。MySQL有幾種不同的日誌檔案,通常包括錯誤日誌檔案,二進位制日誌,通用日誌,慢查詢日誌,等等。這些日誌可以幫助我們定位mysqld內部發生的事件,資料庫效能故障,記錄資料的變更歷史,使用者恢復資料庫等等。本文主要描述通用查詢日誌。

1、MySQL日誌檔案系統的組成
   a、錯誤日誌:記錄啟動、執行或停止mysqld時出現的問題。
   b、通用日誌:記錄建立的客戶端連線和執行的語句。
   c、更新日誌:記錄更改資料的語句。該日誌在MySQL 5.1中已不再使用。
   d、二進位制日誌:記錄所有更改資料的語句。還用於複製。
   e、

慢查詢日誌:記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢。
   f、Innodb日誌:innodb redo log
   
   預設情況下,所有日誌創建於mysqld資料目錄中。
   可以通過重新整理日誌,來強制mysqld來關閉和重新開啟日誌檔案(或者在某些情況下切換到一個新的日誌)。
   當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,則日誌被老化。
   對於存在MySQL複製的情形下,從複製伺服器將維護更多日誌檔案,被稱為接替日誌。

2、慢查詢日誌
   慢查詢日誌是將mysql伺服器中影響資料庫效能的相關SQL語句記錄到日誌檔案,通過對這些特殊的SQL語句分析,改進以達到提高資料庫效能的目的。
   通過使用--slow_query_log[={0|1}]選項來啟用慢查詢日誌。所有執行時間超過long_query_time秒的SQL語句都會被記錄到慢查詢日誌。
   預設情況下hostname-slow.log為慢查詢日誌檔案安名,存放到資料目錄,同時預設情況下未開啟慢查詢日誌。
   預設情況下資料庫相關管理型SQL(比如OPTIMIZE TABLE、ANALYZE TABLE和ALTER TABLE)不會被記錄到日誌。
   對於管理型SQL可以通過--log-slow-admin-statements開啟記錄管理型慢SQL。
   mysqld在語句執行完並且所有鎖釋放後記入慢查詢日誌。記錄順序可以與執行順序不相同。獲得初使表鎖定的時間不算作執行時間。
   
   可以使用mysqldumpslow命令獲得日誌中顯示的查詢摘要來處理慢查詢日誌。
   用查詢快取處理的查詢不加到慢查詢日誌中,表有零行或一行而不能從索引中受益的查詢也不寫入慢查詢日誌。
   MySQL伺服器按以下順序記錄SQL是否寫入到慢查詢日誌
     a. The query must either not be an administrative statement, or --log-slow-adminstatements must have been specified.
     b. The query must have taken at least long_query_time seconds, or log_queries_not_using_indexes must be enabled and the query used no indexes for row lookups.
     c. The query must have examined at least min_examined_row_limit rows.
     d. The query must not be suppressed according to the log_throttle_queries_not_using_indexes setting.

3、慢查詢日誌演示

long_query_time     :  設定慢查詢的閥值,超出次設定值的SQL即被記錄到慢查詢日誌,預設值為10s
slow_query_log      :  指定是否開啟慢查詢日誌
log_slow_queries    :  指定是否開啟慢查詢日誌(該引數要被slow_query_log取代,做相容性保留)
slow_query_log_file :  指定慢日誌檔案存放位置,可以為空,系統會給一個預設的檔案host_name-slow.log
min_examined_row_limit:查詢檢查返回少於該引數指定行的SQL不被記錄到慢查詢日誌
log_queries_not_using_indexes: 不使用索引的慢查詢日誌是否記錄到索引
    
--當前版本
[email protected]
[(none)]> show variables like 'version'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | version | 5.5.39-log | +---------------+------------+ [email protected][(none)]> show variables like '%slow%'; +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | log_slow_queries | OFF | | slow_launch_time | 2 | | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/suse11b-slow.log | +---------------------+---------------------------------+ [email protected][tempdb]> set global log_slow_queries=1; Query OK, 0 rows affected, 1 warning (0.00 sec) [email protected][(none)]> show warnings; +---------+------+-------------------------------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------------------------------------------------------------------------------+ | Warning | 1287 | '@@log_slow_queries' is deprecated and will be removed in a future release. Please use '@@slow_query_log' instead | +---------+------+-------------------------------------------------------------------------------------------------------------------+ --從下面的查詢中可知,2個系統變數log_slow_queries,slow_query_log同時被置為on [email protected][(none)]> show variables like '%slow%'; +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | log_slow_queries | ON | | slow_launch_time | 2 | | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/suse11b-slow.log | +---------------------+---------------------------------+ [email protected][tempdb]> show variables like '%long_query_time%'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ --為便於演示,我們將全域性和session級別long_query_time設定為1 [email protected][tempdb]> set global long_query_time=1; Query OK, 0 rows affected (0.00 sec) [email protected][tempdb]> set session long_query_time=1; Query OK, 0 rows affected (0.00 sec) --Author : Leshami --Blog : http://blog.csdn.net/leshami [email protected][tempdb]> create table tb_slow as select * from information_schema.columns; Query OK, 829 rows affected (0.10 sec) Records: 829 Duplicates: 0 Warnings: 0 [email protected][tempdb]> insert into tb_slow select * from tb_slow; Query OK, 829 rows affected (0.05 sec) Records: 829 Duplicates: 0 Warnings: 0 .....為便於演示,我們插入一些資料,中間重複過程省略 [email protected][tempdb]> insert into tb_slow select * from tb_slow; Query OK, 26528 rows affected (4.40 sec) Records: 26528 Duplicates: 0 Warnings: 0 [email protected][tempdb]> system tail /var/lib/mysql/suse11b-slow.log /usr/sbin/mysqld, Version: 5.5.39-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock Time Id Command Argument # Time: 141004 22:05:48 # [email protected]: root[root] @ localhost [] # Query_time: 4.396858 Lock_time: 0.000140 Rows_sent: 0 Rows_examined: 53056 use tempdb; SET timestamp=1412431548; insert into tb_slow select * from tb_slow; ....再次插入一些記錄.... [email protected][tempdb]> insert into tb_slow select * from tb_slow; Query OK, 212224 rows affected (37.51 sec) Records: 212224 Duplicates: 0 Warnings: 0 [email protected][tempdb]> select table_schema,table_name,count(*) from tb_slow -> group by table_schema,table_name order by 3,2; +--------------------+----------------------------------------------+----------+ | table_schema | table_name | count(*) | +--------------------+----------------------------------------------+----------+ | information_schema | COLLATION_CHARACTER_SET_APPLICABILITY | 1024 | | performance_schema | cond_instances | 1024 | ........... | mysql | user | 21504 | +--------------------+----------------------------------------------+----------+ 83 rows in set (1.58 sec) [email protected][tempdb]> system tail /var/lib/mysql/suse11b-slow.log # [email protected]: root[root] @ localhost [] # Query_time: 37.514172 Lock_time: 0.000123 Rows_sent: 0 Rows_examined: 424448 SET timestamp=1412431806; insert into tb_slow select * from tb_slow; # Time: 141004 22:10:47 # [email protected]: root[root] @ localhost [] # Query_time: 1.573293 Lock_time: 0.000183 Rows_sent: 83 Rows_examined: 424614 SET timestamp=1412431847; select table_schema,table_name,count(*) from tb_slow --這條SQL被記錄下來了,其查詢時間為1.573293s group by table_schema,table_name order by 3,2; [email protected][tempdb]> show variables like '%log_queries_not_using_indexes'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | OFF | +-------------------------------+-------+ [email protected][tempdb]> set global log_queries_not_using_indexes=1; Query OK, 0 rows affected (0.00 sec) --查看錶tb_slow索引資訊,表tb_slow無任何索引 [email protected][tempdb]> show index from tb_slow; Empty set (0.00 sec) [email protected][tempdb]> select count(*) from tb_slow; +----------+ | count(*) | +----------+ | 424448 | +----------+ 1 row in set (0.20 sec) [email protected][tempdb]> system tail -n3 /var/lib/mysql/suse11b-slow.log # Query_time: 0.199840 Lock_time: 0.000152 Rows_sent: 1 Rows_examined: 424448 SET timestamp=1412432188; select count(*) from tb_slow; --此次查詢時間為0.199840,被記錄的原因是因為沒有走索引,因為表本身沒有索引

4、格式化慢查詢日誌

結構化慢查詢日誌就是把慢查詢日誌中的重要資訊按照便於閱讀以及按照特定的排序方式來提取SQL。
這種方式有點類似於Oracle中有個tkprof來格式化oracle的trace檔案。
對於前面的慢查詢日誌我們使用mysqldumpslow來提取如下:

suse11b:~ # mysqldumpslow -s at,al /var/lib/mysql/suse11b-slow.log
Reading mysql slow query log from /var/lib/mysql/suse11b-slow.log
Count: 4  Time=16.87s (67s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  insert into tb_slow select * from tb_slow

Count: 1  Time=0.20s (0s)  Lock=0.00s (0s)  Rows=1.0 (1), root[root]@localhost
  select count(*) from tb_slow

Count: 1  Time=1.57s (1s)  Lock=0.00s (0s)  Rows=83.0 (83), root[root]@localhost
  select table_schema,table_name,count(*) from tb_slow
  group by table_schema,table_name order by N,N

#以下是按照最大耗用時間排最後,只顯示2條的方式格式化日誌檔案
suse11b:~ # mysqldumpslow -r -t 2 /var/lib/mysql/suse11b-slow.log
Reading mysql slow query log from /var/lib/mysql/suse11b-slow.log
Count: 1  Time=1.57s (1s)  Lock=0.00s (0s)  Rows=83.0 (83), root[root]@localhost
  select table_schema,table_name,count(*) from tb_slow
  group by table_schema,table_name order by N,N

Count: 4  Time=16.87s (67s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
  insert into tb_slow select * from tb_slow
  
#獲取mysqldumpslow的幫助資訊
suse11b:~ # mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

  --verbose    verbose
  --debug      debug
  --help       write this text to standard output

  -v           verbose
  -d           debug
  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default
                al: average lock time
                ar: average rows sent
                at: average query time
                 c: count        #query的次數
                 l: lock time
                 r: rows sent    #返回的記錄數
                 t: query time  
  -r           reverse the sort order (largest last instead of first)
  -t NUM       just show the top n queries
  -a           don't abstract all numbers to N and strings to 'S'
  -n NUM       abstract numbers with at least n digits within names
  -g PATTERN   grep: only consider stmts that include this string
  -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
               default is '*', i.e. match all
  -i NAME      name of server instance (if using mysql.server startup script)
  -l           don't subtract lock time from total time


鵬城DBA總群

相關推薦

MySQL 查詢日誌(Slow Query Log)

    同大多數關係型資料庫一樣,日誌檔案是MySQL資料庫的重要組成部分。MySQL有幾種不同的日誌檔案,通常包括錯誤日誌檔案,二進位制日誌,通用日誌,慢查詢日誌,等等。這些日誌可以幫助我們定位mysqld內部發生的事件,資料庫效能故障,記錄資料的變更歷史,使用者恢復資料庫

MySQL 通用查詢日誌(General Query Log)

AC pbo direct 刷新 日誌 use 數據庫 語句 gpl 同大多數關系型數據庫一樣,日誌文件是MySQL數據庫的重要組成部分。MySQL有幾種不同的日誌文件,通常包括錯誤日誌文件,二進制日誌,通用日誌,慢查詢日誌,等等。這些日誌可以幫

MySQL查詢(二) - pt-query-digest詳解查詢日誌 pt-query-digest 日誌分析

進行 www summary exec 存儲 response 狀態 rep ota 隨筆 - 66 文章 - 0 評論 - 19 MySQL慢查詢(二) - pt-query-digest詳解慢查詢日誌 一、簡介 pt-que

MySQL查詢日誌相關的配置和使用。

其他 進制 數據 mps 執行 不存在 時間 tex http MySQL慢查詢日誌提供了超過指定時間閾值的查詢信息,為性能優化提供了主要的參考依據,是一個非常實用的功能,MySQL慢查詢日誌的開啟和配置非常簡單,可以指定記錄的文件(或者表),超過的時間閾值等就可以記

使用Mysql查詢日誌對有效率問題的SQL進行監控

問題 使用 寫入 glob 成了 show 單位 命令 lob 輸入命令:show variables like ‘slow%‘ 可以發現 slow_query_log 為 OFF(默認),表示未開啟慢查詢日誌 slow_query_lo

mysql查詢日誌

微秒 min rip uos pre shel file 缺省 -o mysql慢查詢日誌是mysql提供的一種日誌記錄,它用來記錄sql執行超過long_query_time秒的SQL語句。long_query_time的最小值和默認值分別為0和10。 意思是運行超過10

Mysql 查詢日誌

nbsp 分析 鎖定 永久 工具 多少 set 通過 時間 查看狀態 SHOW VARIABLES LIKE ‘%slow_query_log%‘ 開啟 set global show_query_log=1 (重啟後失效) 永久生效 修改my.cnf 加

Anemometer+Percona Toolki實現MySQL查詢日誌可視化功能

follow mysql服務器 httpd php ade aio water pac 管理 centos 最近發現了一個挺好用的MySQL慢查詢日誌可視化的工具,網上也能找到很多資料,在這裏結合自己的實際情況重新整理一下。 1. 實驗環境 1.1 系統環境: 操作系統:C

設置啟用mysql查詢日誌

mysq mys long file glob 執行時間 mysql slow_log lob --設置log文件位置 set global slow_query_log_file = /sql_log/slow_log.log; --設置是否啟用記錄沒有使用索引的sql

開啟mysql查詢日誌並使用mysqldumpslow命令查看

開啟 mysqld dumps not style 現在 left join 介紹 time Mysql服務器有一項功能,可以檢測到哪條sql語句查詢得比較慢,就是慢查詢slowlog,現在介紹如何開啟。 在[mysqld]下面增加如下代碼: long_query_tim

ELK分析MySQL查詢日誌並生成影象

一、背景 1.MySQL慢查詢日誌格式: # Time: 181109 15:04:08 # [email protected]: tvpayrcdev[tvpayrcdev] @ [172.16.14.51] Id: 8960747 # Query_time: 35.918265 Loc

ELK分析MySQL查詢日誌並生成圖像

-o output 數量 count posit 數據 iou 配置 etc 一、背景 1.MySQL慢查詢日誌格式: # Time: 181109 15:04:08 # User@Host: tvpayrcdev[tvpayrcdev] @ [172.16.14.51]

開啟MYSQL查詢日誌,監控有效率問題的SQL

操作步驟 首先使用使用者登入linux客戶端,執行命令 mysql -u mjb -p, mjb是資料庫使用者名稱,系統會提示輸入密碼,輸入密碼回車,登入成功 輸入命令show variables like 'slow_query_log', 頁面會顯示是

mysql查詢日誌 (李作強)

mysql慢查詢日誌預設情況下統統寫入到一個檔案中,檔案會變的越來越大,非常不方便檢視分析。可以利用logrotate來對mysql慢查詢日誌、錯誤日誌進行切割,便於DBA分析每日慢查詢,優化資料庫。 logrotate工具介紹參見《logrotate日誌管理工具》。 1. 定義日誌輪滾

Mysql查詢日誌分析工具Mysqlsla安裝

yum install perl-DBI perl-DBD-MySQL perl-devel -y yum -y  install perl-Time-HiRes cd /data/software wget  ftp://ftp.tw.freebsd.org/pub/

MySQL查詢日誌

本文:    MySQL中的日誌包括:錯誤日誌、二進位制日誌、通用查詢日誌、慢查詢日誌等等。這裡主要介紹下比較常用的兩個功能:通用查詢日誌和慢查詢日誌。 1、通用查詢日誌:記錄建立的客戶端連線和執行的語句。 2、慢查詢日誌:記錄所有執行時間超過longque

mysql - 查詢日誌、explain詳解

一 開啟慢查詢日誌 show variables like 'slow_query_log'; show variables like 'slow_query%'; show variables like 'long_query_time'; set global slow

mysql 查詢日誌

有時候在測試環境中開發,並不一定能在開發階段解決現有問題,比如由於資料量不對稱,擼的程式碼在測試環境跑的好好的,但在現網環境超時或相應很慢,這時就需要揪出來是哪塊出了問題,哪條sql 執行過慢了。這時就需要在mysql 服務端設定一個時間閾值,超過該閾值就判定是慢查詢,並優化

MySQL查詢日誌釋疑總結

#  mysqldumpslow --helpUsage: mysqldumpslow [ OPTS... ] [ LOGS... ]Parse and summarize the MySQL slow query log. Options are  --verbose    verbose  #顯示詳細資訊

MySQL 查詢日誌總結

文章轉載於http://blog.jobbole.com/105792/ 慢查詢日誌概念 MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指執行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。long_qu