查詢日誌 | general_log |
會記錄用戶的全部操做,其中包含增刪查改等 | 能夠指定輸出爲表 |
慢查詢日誌 | slow_log |
只要超過定義時間的全部操做語句都記錄 | 能夠指定輸出爲表 |
二進制日誌 | log_bin |
記錄可能執行更改的全部操做 | mysqlbinlog查看 |
數據操做過程當中,Mysqld是將接收到的語句按照接收的順序(注意不是執行順序)寫到查詢日誌文件中。一條一條就相似這樣:mysql
# Time: 070927 8:08:52
# User@Host: root[root] @ [192.168.0.20]
# Query_time: 372 Lock_time: 136 Rows_sent: 152 Rows_examined: 263630
select id, name from manager where id in (66,10135);
sql
這樣的話,當咱們去查看日誌內容時就會灰常費時費神費眼睛。那麼應該怎麼破?數據庫
自5.1.6版本起,就有一波新功能出爐,好比查詢日誌能夠寫到數據庫系統中的專用表。bash
MySQL的命令行在啓動時能夠加載不少參數,其中就提供了一個日誌專用的參數--log-output,用來指定日誌文件的輸出方式.app
--log-output參數可選值有三個:tcp
(1)能夠是TABLE、FILE、NONE,也能夠是TABLE及FILE的組合(用逗號隔開),默認爲TABLE。工具
(2)若是組合中出現了NONE,那麼其它設定都將失效,同時,不管是否啓用日誌功能,也不會記錄任何相關的日誌信息。性能
(3)做用範圍爲全局級別,可用於配置文件,屬動態變量。spa
(4)啓用mysqld進程時附加--log-output指定日誌輸出類型。命令行
MySQL支持將慢查詢日誌保存到mysql.slow_log這張表中:
若是慢查詢日誌輸出類型已經指定了FILE,在日誌量大的狀況下,咱們能夠藉助一些分析工具。
(2)mysqlsla
hackmysql.com推出的一款日誌分析工具
功能很是強大. 數據報表,很是有利於分析慢查詢的緣由, 包括執行頻率, 數據量, 查詢消耗等.
格式說明以下:
總查詢次數 (queries total), 去重後的sql數量 (unique)輸出報表的內容排序(sorted by)最重大的慢sql統計信息, 包括平均執行時間, 等待鎖時間, 結果行的總數, 掃描的行總數。
Count: sql的執行次數及佔總的slow log數量的百分比。
Time: 執行時間, 包括總時間, 平均時間, 最小, 最大時間, 時間佔到總慢sql時間的百分比。
95% of Time: 去除最快和最慢的sql, 覆蓋率佔95%的sql的執行時間。
Lock Time: 等待鎖的時間。
95% of Lock: 95%的慢sql等待鎖時間。
Rows sent: 結果行統計數量, 包括平均, 最小, 最大數量。
Rows examined: 掃描的行數量。
Database: 屬於哪一個數據庫。
Users: 哪一個用戶IP佔到全部用戶執行的sql百分比。
Query abstract: 抽象後的sql語句。
Query sample: sql語句。
除了以上的輸出, 官方還提供了不少定製化參數, 是一款不可多得的好工具。
(3) pt-upgrade
這個工具用來檢查在新版本中運行的SQL是否與老版本同樣,返回相同的結果,最好的應用場景就是數據遷移的時候。
pt-upgrade h=host1 h=host2 slow.log
(4) pt-query-digest
能夠從普通MySQL日誌,慢查詢日誌以及二進制日誌中分析查詢,甚至能夠從SHOW PROCESSLIST和MySQL協議的tcpdump中進行分析,若是沒有指定文件,它從標準輸入流(STDIN)中讀取數據。
最簡單的用法以下:
pt-query-digest slow.logs
整個輸出分爲三大部分:
一、總體概要(Overall)
這個部分是一個大體的概要信息(相似loadrunner給出的概要信息),經過它能夠對當前MySQL的查詢性能作一個初步的評估,好比各個指標的最大 值(max),平均值(min),95%分佈值,中位數(median),標準誤差(stddev)。這些指標有查詢的執行時間(Exec time),鎖佔用的時間(Lock time),MySQL執行器須要檢查的行數(Rows examine),最後返回給客戶端的行數(Rows sent),查詢的大小。
二、查詢的彙總信息(Profile)
這個部分對全部」重要」的查詢(一般是比較慢的查詢)作了個一覽表:
每一個查詢都有一個Query ID,這個ID經過Hash計算出來的。pt-query-digest是根據這個所謂的Fingerprint來group by的。舉例下面兩個查詢的Fingerprint是同樣的都是select * from table1 where column1 = ?,工具箱中也有一個與之相關的工具pt-fingerprint。
select * from table1 where column1 = 2 select * from table1 where column1 = 3
在尾部有一行輸出,顯示了其餘2個佔比較低而不值得單獨顯示的查詢的統計數據。
三、詳細信息
這個部分會列出Profile表中每一個查詢的詳細信息:
包括Overall中有的信息、查詢響應時間的分佈狀況以及該查詢」入榜」的理由。
BOX Anemometer是 基於pt-query-digest將MySQL慢查詢可視化