mysqldumpslow日誌分析

rainbowbridg發表於2009-09-08
[zz]用mysqldumpslow分析mysql的slow query log
2009-06-18 16:43

一、mysqldumpslow

官方文件:http://dev.mysql.com/doc/refman/5.1/en/mysqldumpslow.html

shell> mysqldumpslow [options] [log_file ...]

Table 4.12. mysqldumpslow Option Reference

FormatConfig FileDescriptionIntroductionDeprecatedRemoved
-aDo not abstract all numbers to N and strings to S
-n numAbstract numbers with at least the specified digits
--debugdebugWrite debugging information
-g patternOnly consider statements that match the pattern
--helpDisplay help message and exit
-h nameHost name of the server in the log file name
-i nameName of the server instance
-lDo not subtract lock time from total time
-rReverse the sort order
-s valueHow to sort output
-t numDisplay only first num queries
--verboseverboseVerbose mode

mysql有一個功能就是可以log下來執行的比較慢的sql語句,預設是沒有這個log的,為了開啟這個功能,要修改my.cnf或者在mysql啟動的時候加入一些引數。如果在my.cnf裡面修改,需增加如下幾行

long_query_time = 1
log-slow-queries = /var/youpath/slow.log
log-queries-not-using-indexes

long_query_time 是指執行超過多久的sql會被log下來,這裡是1秒。
log-slow-queries 設定把日誌寫在那裡,可以為空,系統會給一個預設的檔案host_name-slow.log,我生成的log就在mysql的data目錄
log-queries-not-using-indexes 就是字面意思,log下來沒有使用索引的query。

把上述引數開啟,執行一段時間,就可以關掉了,省得影響生產環境。

接下來就是分析了,我這裡的檔名字叫host-slow.log。
mysqldumpslow –help以下,俺主要用的是
-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string

-s,是order的順序,說明寫的不夠詳細,俺用下來,包括看了程式碼,主要有
c,t,l,r和ac,at,al,ar,分別是按照query次數,時間,lock的時間和返回的記錄數來排序,前面加了a的時倒敘
-t,是top n的意思,即為返回前面多少條的資料
-g,後邊可以寫一個正則匹配模式,大小寫不敏感的

mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log

上述命令可以看出訪問次數最多的20個sql語句和返回記錄集最多的20個sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
這個是按照時間返回前10條裡面含有左連線的sql語句。

用了這個工具就可以查詢出來那些sql語句是效能的瓶頸,進行最佳化,比如加索引,該應用的實現方式等。

二、mysqldumpslow

MySQL 自帶 slow log 的分析工具 mysqldumpslow ,但是沒有說明。本文透過分析該指令碼,介紹了其用法。
slow log 是 MySQL 根據 SQL 語句的執行時間設定,寫入的一個檔案,用於分析執行較慢的語句。

只要在 my.cnf 檔案中配置好:
log-slow-queries = [slow_query_log_filename]
即可記錄超過預設的 10s 執行時間的 SQL 語句。
如果要修改預設設定,可以新增:
long_query_time = 5
設定為 5s 。

如果要記錄所有 SQL 語句,可以寫入:
log-long-format



# t=time, l=lock time, r=rows
# at, al, 以及 ar 是對應的平均值

mysqldumpslow 可以接受的引數有:
'v+', # verbose
'd+', # debug
's=s', # 排序 (t, at, l, al, r, ar etc)
'r!', # 倒排序 (largest last instead of first)
't=i', # 顯示最高的 n 個查詢
'a!', # 不把所有的數字以 N ,字串以 'S' 顯示
'n=i', # abstract numbers with at least n digits within names
'g=s', # grep: only consider stmts that include this string
'h=s', # hostname of db server for *-slow.log filename (can be wildcard)
'i=s', # name of server instance (if using mysql.server startup script)
'l!', # don't subtract lock time from total time

'verbose|v+',# verbose
'help+', # write usage info
'debug|d+', # debug
's=s', # what to sort by (t, at, l, al, r, ar etc)
'r!', # reverse the sort order (largest last instead of first)
't=i', # just show the top n queries
'a!', # don't abstract all numbers to N and strings to 'S'
'n=i', # abstract numbers with at least n digits within names
'g=s', # grep: only consider stmts that include this string
'h=s', # hostname of db server for *-slow.log filename (can be wildcard)
'i=s', # name of server instance (if using mysql.server startup script)
'l!', # don't subtract lock time from total time

以時間倒序顯示前10個慢查詢日誌:mysqldumpslow -s at -t 10 /var/db/mysql/db-slow.log

來源:

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7916042/viewspace-1026768/,如需轉載,請註明出處,否則將追究法律責任。

相關文章