作爲一個MySQL DBA,分析慢查詢是平常主要的工做之一,以前一直使用mysqlsla做爲分析慢查詢的, 由於簡單而且也能知足本身對慢查詢分析的要求,對於另外一個工具pt-query-digest並不熟悉,對於pt系列的工具以前也介紹過一些,Percona Toolkit確實厲害,整個全家桶:包含了備份、監控、各類分析工具,以及定製化過的MySQL Server。 如今本文來介紹下如何使用pt-query-digest,也方便本身查閱。html
不少人都把pt-query-digest做爲分析mysql工具的首選,由於它能夠從logs、processlist、和tcpdump 來分析MySQL的情況,logs包括slow log、general log、binlog。也能夠把分析結果輸出到文件中,或則把文件寫到表中。分析過程是先對查詢語句的條件進行參數化,而後對參數化之後的查詢進行分組統計,統計出各查詢的執行時間、次數、佔比等,能夠藉助分析結果找出問題進行優化。mysql
進入到下載頁,下載Percona Toolkitgit
pt-query-digest [OPTIONS] [FILES] [DSN]
pt-query-digest分析slow log、general log和binary log,還能夠分析來自SHOW PROCESSLIST的查詢和來自tcpdump的MySQL協議數據。 默認狀況下,查詢按fingerprint分組,並按查詢時間的降序排列(最慢的查詢排在第一位)。 若是未提供文件,則該工具讀取STDIN。 可選的DSN用於某些選項,例如--since和--until。github
1)從slow.log報告最慢的查詢正則表達式
pt-query-digest slow.log
2)從host1上的processlist裏報告最慢的查詢sql
pt-query-digest --processlist h=host1
3)使用tcppdump捕獲MySQL協議數據,而後報告最慢的查詢shell
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt pt-query-digest --type tcpdump mysql.tcp.txt
4)將查詢數據從slow.log保存到host2,以供之後查看和趨勢分析數據庫
pt-query-digest --review h=host2 --no-report slow.log
pt-query-digest是一種複雜但易於使用的工具,用於分析MySQL查詢。它能夠分析來自MySQL慢速日誌,常規日誌和二進制日誌的查詢(二進制日誌必須首先轉換爲文本,請參閱--type)。默認狀況下,該工具報告哪些查詢最慢。可使用--group-by、--filter和--embedded-attributes之類的選項來建立更復雜和定製的報告。json
pt-query-digest具備兩個功能:查詢查看(--review)和查詢歷史記錄(--history)。使用--review選項時,全部查詢都將保存到數據庫中。當再次使用--review運行該工具時,數據庫中標記爲已審閱的查詢不會打印在報告中,只顯示須要審查的新查詢。使用--history選項時,每一個查詢的指標(查詢時間,鎖時間等)都保存到數據庫中。每次使用--history運行該工具時,都會保存更多的歷史數據,這些數據可用於隨時間推移趨勢和分析查詢性能。緩存
若是使用--filter,-ignore-attributes和其餘與屬性相關的選項時,必須熟悉這些屬性,若是不須要自定義能夠跳過屬性說明。
pt-query-digest處理event,這些event是稱爲屬性的鍵值對的集合,能識別出大多數屬性:Query_time,Lock_time等。若是編寫--filter,請務必在使用每一個event以前檢查其屬性是否已定義,不然過濾器代碼可能會因「使用未初始化的值」錯誤而使工具崩潰。有關常見和--type特定屬性的列表:爲任何輸入轉儲event屬性:
$ pt-query-digest \ slow.log \ --filter 'print Dumper $event' \ --no-report \ --sample 1
產生不少帶有「 attribute => value」對的輸出:
$VAR1 = { Query_time => '0.033384', Rows_examined => '0', Rows_sent => '0', Thread_id => '10', Tmp_table => 'No', Tmp_table_on_disk => 'No', arg => 'SELECT col FROM tbl WHERE id=5', bytes => 103, cmd => 'Query', db => 'db1', fingerprint => 'select col from tbl where id=?', host => '', pos_in_log => 1334, ts => '071218 11:48:27', user => '[SQL_SLAVE]' };
經過編寫--filter,能夠建立從現有屬性派生的新屬性。 例如,要建立一個名爲Row_ratio的屬性以檢查Rows_sent與Rows_examined的比率,請指定一個過濾器:
--filter '($event->{Row_ratio} = $event->{Rows_sent} / ($event->{Rows_examined})) && 1'
須要使用&& 1技巧來建立始終爲true的有效單行語法,新屬性將自動出如今輸出中:
# Row ratio 1.00 0.00 1 0.50 1 0.71 0.50
默認的--output是查詢分析報告。 --no-report選項控制是否打印此報告。使用--review或--history時,解析全部查詢但不顯示報告。
報告裏的列說明:
Column Meaning ============ ========================================================== Rank 查詢在分析的整個查詢集中的排名 Query ID 查詢的指紋(fingerprint) Response time 總響應時間,佔總響應時間的百分比 Calls 執行此查詢的次數 R/Call 每次執行的平均響應時間 V/M 響應時間的方差均值比 Item 查詢 示例: # Rank Query ID Response time Calls R/Call V/M # ==== ================================== ============= ===== ====== ===== # 1 0x95BE8AA82ED172A4ABAFC4ED3B792467 6.0100 100.0% 2 3.0050 0.00 SELECT x
拆分多部分說明報告信息:
# Query 2: 0.01 QPS, 0.02x conc, ID 0xFDEA8D2993C9CAF30x6F7A87D11DDD9CC608CCACD1427CD832 at byte 160665
說明:查詢的順序號、每秒查詢量、查詢的近似併發度(根據時間隔和總Query_time計算)、查詢ID。若是使用--review,則此ID是數據庫中查詢校驗和的十六進制。可使用SELECT ...之類的查詢從數據庫中選擇已審覈查詢的詳細信息:WHERE checksum = 0xFDEA8D2993C9CAF3。
若是想打印出特定查詢的每一個樣本:去掉查詢ID的0x
pt-query-digest test2-slow.log --no-report --output slowlog --filter '$event->{fingerprint} && make_checksum($event->{fingerprint}) eq "6F7A87D11DDD9CC608CCACD1427CD832"' # Time: 2020-02-28T10:49:34 # User@Host: root[root] @ test2 [] # Thread_id: 19 # Query_time: 3.003152 Lock_time: 0.002218 Rows_sent: 1 Rows_examined: 2 use orchestrator; select count(*),sleep(3) from cluster_domain_name;
接下來是有關此類查詢的指標表:
# Attribute pct total min max avg 95% stddev median # ============ === ======= ======= ======= ======= ======= ======= ======= # Count 20 1 # Exec time 13 3s 3s 3s 3s 3s 0 3s # Lock time 33 2ms 2ms 2ms 2ms 2ms 0 2ms # Rows sent 5 1 1 1 1 1 0 1 # Rows examine 11 2 2 2 2 2 0 2 # Query size 25 49 49 49 49 49 0 49 # Row ratio 11 0.50 0.50 0.50 0.50 0.50 0 0.50
第一行是表的列標題:屬性、百分比(總計的百分比),總計、最大、最小、平均、95%的值小於或等於此值、標準誤差和中位數都是從第95個百分位數計算得出的。
接下來,將查詢有關用戶,數據庫和時間範圍的統計信息:
# Users 1 user1 # Databases 2 db1(1), db2(1) # Time range 2008-11-26 04:55:18 to 2008-11-27 00:15:15
用戶和數據庫顯示爲不一樣值的計數。若是隻有一個,則會單獨顯示; 若是有不少,將顯示每一個最常出現的頻率,而後顯示它出現的次數。
而後看執行時間分佈:
# Query_time distribution # 1us # 10us # 100us # 1ms # 10ms ##### # 100ms #################### # 1s ########## # 10s+
執行時間顯示時間聚類的分佈圖。 每一個查詢都進入「存儲桶」之一,並被計算在內。 第一個存儲桶的全部值都在「單個微秒範圍」內-小於10us。 第二個是「數十微秒」,從10us到(但不包括)100us; 等等。 能夠經過指定--report-histogram更改圖表屬性,但僅限於基於時間的屬性。
而後看錶信息:
# Tables # SHOW TABLE STATUS LIKE 'table1'\G # SHOW CREATE TABLE `table1`\G # EXPLAIN SELECT * FROM table1\G
經過給出的信息能夠獲得表的基本信息,以及其執行計劃,對於沒法執行的非SELECT查詢,該工具會嘗試將該查詢轉換爲大體等效的SELECT查詢,並將其添加到下面。
--review是存儲全部已分析的查詢,能夠將元數據添加到查詢類別中,例如將其標記爲後續跟蹤,爲查詢添加註釋或爲問題跟蹤系統使用問題ID標記它們。能夠存儲歷史數據,例如行數,查詢時間以及一般能夠在報告中看到的任何內容。
要使用此功能,請使用--review選項運行pt-query-digest。它將指紋和其餘信息存儲到指定的表中。下次使用相同的選項運行它時,它將執行如下操做:
# Review information # comments: really bad IN() subquery, fix soon! # first_seen: 2008-12-01 11:48:57 # jira_ticket: 1933 # last_seen: 2008-12-18 11:49:07 # priority: high # reviewed_by: xaprb # reviewed_on: 2008-12-18 15:03:11
此元數據頗有用,由於當分析查詢時,會將註釋直接集成到報告中。
簡而言之就是將將類似的查詢分組在一塊兒,如:
SELECT name, password FROM user WHERE id='12823'; select name, password from user where id=5;
能夠合併當成:
select name, password from user where id=?
--ask-pass FALSE #鏈接到MySQL時提示輸入密碼 --attribute-aliases db|Schema #屬性列表|別名等(默認db | Schema) --attribute-value-limit 0 #屬性值的限制(默認爲0) --charset (No value) #默認字符集 #逗號分隔的配置文件列表;若是指定,則必須是命令行上的第一個選項 --config /etc/percona-toolkit/percona-toolkit.conf,/etc/percona-toolkit/pt-query-digest.conf,/root/.percona-toolkit.conf,/root/.pt-query-digest.conf --continue-on-error TRUE #即便有錯誤也繼續解析(默認爲是) --create-history-table TRUE #建立--history表(若是不存在)(默認爲yes) --create-review-table TRUE #建立--review表(若是不存在)(默認爲yes) --daemonize FALSE #Fork到後臺並從shell分離 --database (No value) #鏈接到該數據庫 --defaults-file (No value) #僅從給定文件讀取mysql選項 --embedded-attributes (No value) #兩個Perl正則表達式模式,用於捕獲查詢中嵌入的僞屬性 --expected-range 5,10 #當數量多於或少於預期時解釋項目(默認值爲5,10) --explain (No value) #使用此DSN對示例查詢運行EXPLAIN並打印結果 --filter (No value) #丟棄此Perl代碼未返回true的事件 --group-by fingerprint #要對事件的哪一個屬性進行分組(默認fingerprint) --help TRUE #顯示幫助並退出 --history (No value) #在給定表中保存每一個查詢類的指標。 pt-query-digest將查詢指標(查詢時間,鎖定時間等)保存到此表中,以便您查看查詢類如何隨時間變化 --host (No value) #鏈接到主機 --ignore-attributes arg,cmd,insert_id,ip,port,Thread_id,timestamp,exptime,flags,key,res,val,server_id,offset,end_log_pos,Xid #不要聚合這些屬性 --inherit-attributes db,ts #若是丟失,則從具備屬性的最後一個事件繼承這些屬性(默認db,ts) --interval .1 #輪詢show processlist的頻率,以秒爲單位(默認爲.1) --iterations 1 #在收集和報告週期中迭代多少次(默認爲1) --limit 95%:20 #將輸出限制爲給定的百分比或計數(默認爲95%:20) --log (No value) #守護進程時將全部輸出打印到此文件 --max-hostname-length 10 #將報告中的主機名修剪到此長度。 0 =不修剪主機名(默認爲10) --max-line-length 74 #將行修剪到此長度。 0 =不修剪線條(默認74) --order-by Query_time:sum #按此屬性:聚合函數對事件進行排序(默認Query_time:sum) --outliers Query_time:1:10 #按屬性:百分比:計數報告異常值(默認查詢時間:1:10) --output report #如何格式化和打印查詢分析結果(默認report) --password (No value) #鏈接時使用的密碼 --pid (No value) #建立給定的PID文件 --port (No value) #用於鏈接的端口號 --preserve-embedded-numbers FALSE #查詢時保留數據庫/表名中的數字 --processlist (No value) #使用--interval sleep輪詢此DSN的進程列表以進行查詢 --progress time,30 #將進度報告打印到STDERR(默認時間30) --read-timeout 0 #等待的超時時間,等待來自輸入的事件; 0表示永遠等待(默認值爲0)。 可選後綴s =秒,m =分鐘,h =小時,d =天; 若是沒有後綴,則使用s。 --report TRUE #打印每一個--group-by屬性的查詢分析報告(默認爲yes) --report-all FALSE #報告全部查詢,甚至包括已審覈的查詢 --report-format rusage,date,hostname,files,header,profile,query_report,prepared #打印查詢分析報告的這些部分 --report-histogram Query_time #繪製此屬性值的分佈圖(默認Query_time) --resume (No value) #若是指定,該工具會將最後一個文件偏移(若是有的話)寫入給定的文件名 --review (No value) #保存查詢以供之後查看,而且不報告已查看的 --run-time (No value) #每一個迭代要運行多長時間。可選後綴s =秒,m =分鐘,h =小時,d =天;若是沒有後綴,則使用s。 --run-time-mode clock #設置--run-time的值所用的值(默認clock) --sample (No value) #過濾掉每一個查詢中除前N個事件外的全部事件 --set-vars #在此以逗號分隔的(變量=值對)列表中設置MySQL變量 --show-all #顯示這些屬性的全部值 --since (No value) #解析僅查詢比該值新的查詢(自此日期以來解析查詢) --slave-password (No value) #設置用於鏈接到從的密碼 --slave-user (No value) #設置用於鏈接到從的用戶 --socket (No value) #用於鏈接的套接字文件 --timeline FALSE #顯示事件的時間表 --type slowlog #要解析的輸入的類型(默認慢日誌) --until (No value) #僅解析早於此值的查詢(直到此日期爲止解析查詢) --user (No value) #用於登陸的用戶(若是不是當前用戶) --variations #報告這些屬性值的變化數量 --version FALSE #顯示版本並退出 --version-check TRUE #檢查最新版本的Percona Toolkit,MySQL和其餘程序(默認爲是) --vertical-format TRUE #在報告的SQL查詢中輸出尾隨的「 \ G」(默認爲是) --watch-server (No value) #此選項告訴pt-query-digest在解析tcpdump時要監視哪一個服務器IP地址和端口(例如「 10.0.0.1:3306」)(對於--type tcpdump);其餘全部服務器均被忽略
1,--ask-pass:鏈接到MySQL時提示輸入密碼。
2,--attribute-aliases: 默認值:db | Schema。若是event不具備主要屬性,則將查找別名屬性。 若是找到別名,則會使用別名屬性的值建立主要屬性,並刪除別名屬性。
3,--attribute-value-limit:默認值:0,屬性的限制值。處理慢查詢中的錯誤,這些錯誤會致使屬性值過大。 若是值大於此值,則使用該查詢類別的最後一次看到的值。
4,--charset:鏈接數據庫的默認字符集。
5,--config:逗號分隔的配置文件列表;若是指定,則必須是命令行上的第一個選項。
6,--[no]continue-on-error:即便有錯誤,也繼續解析。 該工具不會永遠持續下去:一旦任何過程致使100個錯誤,它將中止運行,默認yes。
7,--[no]create-history-table:建立--history表(若是不存在),默認yes。
8,--[no]create-review-table:若是--review表不存在,則建立它,默認yes。
9,--daemonize:守護進程執行,fork到後臺並從shell分離。
10,--database:鏈接到該數據庫,縮寫-D。
11,--defaults-file:從給定文件中讀取mysql選項,必須提供絕對路徑名,縮寫-F。
12,--embedded-attributes:兩個Perl正則表達式模式,用於捕獲查詢中嵌入的僞屬性。
13,--expected-range:當數量多於或少於預期時,請說明,默認5,10。
14,--explain:使用此DSN對示例查詢運行EXPLAIN並打印結果。
--explain='h=192.168.163.132,u=root,p=root'
15,--filter:過濾器規則,捨棄此Perl代碼未返回true的事件。屬性的名稱能夠看文章前面的 「 attribute => value」。
--filter '$event->{arg} =~ m/^select/i' --filter '$event->{fingerprint} =~ m/^select/i'
--filter '$event->{user} =~ m/^zhou/i' --filter '($event->{user} || "") =~ m/^zhou/i'
--filter '($event->{host} || $event->{ip} || "") =~ m/^192.168.163.111/i'
--filter '($event->{db} || "") =~ m/^zhoujinyi/i'
--filter '(($event->{db} || "") =~ m/^mysql/i) && (($event->{fingerprint} || "") =~ m/^select/i)'
16,--group-by:對event的哪一個屬性進行分組(默認fingerprint)。能夠根據查詢的任何屬性(如user或db)將查詢分組爲類,默認狀況下,這些屬性將顯示哪些用戶和哪些數據庫得到的Query_time最多。每一個值在--order-by中的相同位置必須具備對應的值。爲方便起見,將值添加到--group-by將自動將值添加到--order-by。如根據db和user分組:
--group-by=db,user # Report grouped by db ... # Report grouped by user ...
可選值還有:
17,--history:DSN選項,在給定表中保存每一個查詢類的指標(查詢時間,鎖定時間等)。默認表是percona_schema.query_history,指定數據庫(D)和表(t)的DSN選項以覆蓋默認值。 除非指定了--no-create-history-table,不然將自動建立數據庫和表。
--history='h=192.168.163.132,u=root,p=root'
從Percona Toolkit 3.0.11開始,校驗和功能已更新爲在MD5總和中使用32個字符。 這將致使歷史記錄表中的校驗和字段的值與該工具的早期版本中的值不一樣。
只針對slowlog?
18,--host:鏈接到主機,縮寫-h。
19,--ignore-attributes:不要聚合這些屬性,默認值:arg, cmd, insert_id, ip, port, Thread_id, timestamp, exptime, flags, key, res, val, server_id, offset, end_log_pos, Xid
20,--inherit-attributes:繼承屬性,默認值:db,ts。若是缺乏屬性,從它們的最後一個event繼承這些屬性。如一個event的db屬性等於「 foo」,而下一個事件沒有db屬性,則它繼承其db屬性的「 foo」。
21,--interval:輪詢processlist列表的頻率,默認爲:.1,以秒爲單位。
22,--iterations:收集和報告週期中迭代次數,默認爲1。若是爲0,則迭代到無窮大。每次迭代都運行--run-time的時間。使用--run-time-mode interval時,由--run-time指定的間隔時間決定。
23,--limit:限制顯示,默認值:95%:20。將輸出限制爲給定的百分比或行數。若是參數是整數,則僅報告前N個最差查詢。若是參數是%,報告最差查詢的百分比。若是百分比後跟冒號和另外一個整數,報告最高百分比或該整數指定的數字,以先到者爲準。
24,--log:若是以守護程序方式容許,則將全部輸出打印到此文件。
25,--max-hostname-length:將報告中的主機名修剪到此長度,默認10,0爲不修剪主機名。
26,--max-line-length:將線修剪到此長度。默認74,0爲不修剪線。
27,--order-by:一個用逗號分隔的order-by表達式列表,經過此屬性和聚合函數對事件進行排序,默認值:Query_time:sum,也用於--group-by屬性。當解析常規日誌(--type genlog)時,默認的變爲Query_time:cnt。常規日誌不會報告查詢時間,所以只有cnt聚合纔有意義,由於全部查詢時間均爲零。
#按總的執行時間排序 --order-by=Query_time:sum #按總的執行次數排序 --order-by=Query_time:cnt
28,--outliers:按照定義的值報告異常值,默認值:Query_time:1:10,語法是用冒號分隔的字符串的逗號分隔列表。 第一個字段是定義異常值的屬性。 第二個是與該屬性的第95個百分點進行比較的數字。 第三個是可選的,而且與屬性的cnt集合進行比較。 無論--limit中指定了什麼限制,經過此規範的查詢都會添加到報告中。即返回95%欄位的Query_time>=1秒,且執行次數>=10次。最終結果是取limit和outliers的並集,這也就是爲何顯示指定limit參數,返回的結果並不全知足limit參數,還會返回匹配outliers的結果(好比--limit=1,按照正常會只取1條,可是異常值的也有1條,則就返回2個query)。
--outliers=Query_time:30:1
29,--output:格式化和打印查詢分析結果,默認值:report。可選值:
report:標準查詢分析報告 slowlog:MySQL慢查詢模式 json:json模式 json-anon:json模式,無查詢示例 secure-slowlog:MySQL慢查詢模式,無查詢示例
能夠經過指定--no-report禁用整個報告輸出,而且能夠經過指定--report-format禁用或從新排列其部分。
30,--password:縮寫-p,鏈接時使用的密碼。 若是密碼包含逗號,則必須使用反斜槓將其轉義
31,--pid:建立給定的PID文件。 若是PID文件已經存在而且包含的PID與當前的PID不一樣,則該工具將沒法啓動。 可是,若是存在PID文件,而且其中包含的PID再也不運行,則該工具將使用當前PID覆蓋PID文件。 工具退出後,PID文件將自動刪除。
32,--port:縮寫-P,用於鏈接的端口號。
33,--preserve-embedded-numbers:在報告中的樣本中,保存數據庫/表名稱中保留數字。使得SELECT * FROM db1.table2不會變成SELECT * FROM db?.table?。
34,--processlist:輪詢此DSN的進程列表以進行分析,並使用--interval sleep間隔:
#間隔1s執行show full processlist 拉取processlist中訂閱到的慢查詢轉存到指定的文件。
pt-query-digest --processlist h=192.168.163.132,u=root,p=root --interval=1 --output=slowlog > /tmp/process.log
配合--run-time使用,能夠限制執行時間,到時間(--iterations=1)以後退出而且打印分析。
#間隔1s執行show full processlist,永遠運行,每30秒生成一次報告
pt-query-digest --processlist h=192.168.163.132,u=root,p=root --interval=1 --run-time-mode=clock --run-time=30s --iterations=0
35,--progress:打印進度,默認值:time:30。 第一部分能夠比例、時間或迭代週期;第二部分指定多長時間更新應打印,百分比,秒,或迭代次數。將進度報告打印到STDERR。
--progress=time,30 按照時間 --progress=percentage,10 按照百分比
36,--read-timeout:讀取超時,默認0,不超時。此選項設置等待輸入event的最長時間(Reading from STDIN)。 適用於--processlist之外的全部類型的輸入。 若是在指定時間後未收到event,腳本將中止讀取輸入並打印其報告。 若是--iterations爲0或大於1,則下一個迭代將開始,不然腳本將退出。
37,--report:打印每一個--group-by屬性的查詢分析報告(默認爲yes)。若是不須要報告(例如,使用--review或--history時),則指定--no-report。
38,--report-all:打印全部查詢。
39,--report-format:打印查詢分析報告格式,默認:rusage,date,hostname,files,header,profile,query_report,prepared。
SECTION PRINTS ============ ====================================================== rusage CPU時間和內存使用狀況 date 當前本地時間 hostname 運行pt-query-digest的計算機的主機名 files 輸入文件讀取/解析 header 整個分析運行的摘要 profile 報告概述 query_report 每一個惟一查詢的詳細信息 prepared 準備好的陳述
這些部分按指定的順序打印,若是一塊兒指定,則rusage、date、files、和header會分組在一塊兒,其餘部分由空行分隔。
40,--report-histogram:報告的直方圖,默認值:Query_time。繪製該屬性值的分佈圖。基於時間的屬性直方圖:
# Query_time distribution # 1us # 10us # 100us # 1ms # 10ms ########################### # 100ms ######################################################## # 1s ######## # 10s+
詳細說明能夠看上面 輸出值 部分。
41,--resume:將最後一個文件偏移(若是有的話)寫入給定的文件名。 當再次使用該選項的相同值運行時,該工具將從文件中讀取最後一個文件偏移,在日誌中查找到該位置,而後從該點開始繼續解析事件。
42,--review:類型爲DSN,保存查詢供之後查看,而且不要報告已看的查詢。默認表是percona_schema.query_review。指定數據庫(D)和表(t)的DSN選項以覆蓋默認值。除非指定了--no-create-review-table,不然將自動建立數據庫和表。若是該表是手動建立的,則它至少必須包含如下幾列。能夠出於本身的特殊目的添加更多列,但pt-query-digest不會使用它們。
表結構:
CREATE TABLE IF NOT EXISTS query_review ( checksum CHAR(32) NOT NULL PRIMARY KEY, fingerprint TEXT NOT NULL, sample TEXT NOT NULL, first_seen DATETIME, last_seen DATETIME, reviewed_by VARCHAR(20), reviewed_on DATETIME, comments TEXT )
列說明:
COLUMN MEANING =========== ==================================================== checksum 查詢指紋的64位校驗和 fingerprint 查詢的抽象版本;它的主鍵 sample 查詢樣本的文本 first_seen 此類查詢的最先時間戳 last_seen 此類查詢的最近時間戳 reviewed_by 若是設置,此後將跳過查詢 reviewed_on 沒有賦予任何特殊含義 comments 沒有賦予任何特殊含義
注意,fingerprint列是一類查詢的主鍵。 校驗和只是該值的加密哈希,它提供了一個較短的值,該值極可能也是惟一的。解析和彙總事件後,表應爲每一個fingerprint包含一行。 此選項取決於--group-by(默認fingerprint),不然它將沒法正常工做。
43,--run-time:每一個--iterations要運行多長時間。 默認永遠運行(CTRL-C中斷)。 由於--iterations默認爲1,若是指定--run-time,會運行該時間,而後退出。 一塊兒指定了這兩個選項以執行收集和報告週期。 如使用連續輸入(例如STDIN或--processlist)指定--iterations 2 --run-time 1m將致使pt-query-digest運行1分鐘(1分鐘x2),報告2次,每1分鐘間隔一次。
pt-query-digest --processlist='h=192.168.163.132,u=root,p=root' --iterations=2 --run-time=1m
44,--run-time-mode:設置--run-time的模式,默認值:clock。可選值有:
45,--sample:過濾掉每一個查詢中除前N個事件以外的全部事件。 查詢是根據--group-by中的第一個值進行過濾的,所以默認狀況下,它將按查詢指紋進行過濾。
pt-query-digest --sample 2 --no-report --output slowlog slow.log
--sample 2將容許對每一個指紋進行兩次樣本查詢,與--output slowlog一塊兒使用可用於打印查詢。
46,--slave-user:設置用於鏈接到從的用戶。 此參數容許擁有其餘用戶,該用戶在從上具備較少的特權,但必須存在於全部從站上。
47,--slave-password:設置用於鏈接到從的密碼。 能夠與–slave-user一塊兒使用,而且該用戶的密碼在全部從上都必須相同。
48,--set-vars:設置MySQL變量,以逗號分隔的 變量=值 對列表。
--set-vars wait_timeout=500
49,--show-all:顯示屬性的全部值,默認狀況下只顯示一行中包含的儘量多的屬性值。 此選項容許指定將顯示全部值的屬性(忽略線寬)。 這僅適用於具備字符串值的屬性,例如用戶,主機,數據庫等。能夠指定多個屬性,以逗號分隔。
50,--since:解析比該值更新的查詢。該值能夠是幾種類型:
1. 具備可選後綴的簡單時間值N:N [shmd],s =秒,h =小時,m =分鐘,d =天(若是沒有後綴,則默認爲s)這就像在說「由於N [shmd]以前」 2.帶可選小時,分鐘,秒的完整日期:YYYY-MM-DD [HH:MM:SS] 3.簡短的MySQL風格日期:YYMMDD [HH:MM:SS] 4. MySQL評估的任什麼時候間表達式:CURRENT_DATE-間隔7天
若是提供MySQL時間表達式,須要制定DSN來鏈接MySQL進行計算。須要指定--until參數來限制時間。
51,--until:解析早於此值的查詢,--since的類型同樣。
52,--socket:指定鏈接套接字文件。
53,--timeline:爲events顯示時間線,此選項使pt-query-digest打印另外一種報告:event的時間軸。每一個查詢仍根據--group-by進行分組並聚合,隨後將按時間順序打印。時間線報告將打印出每一個類的時間戳,時間間隔,計數和值。若是隻須要時間軸報告,則指定--no-report以取消默認查詢分析報告。不然,時間軸報告將在響應時間配置文件的末尾打印。如:
#pt-query-digest test2-slow.log --type=slowlog --group-by distill --timeline # ######################################################################## # distill report # ######################################################################## # 2020-02-28T13:43:52 00:19 3 SELECT x # 2020-02-28T13:45:22 00:48 2 SELECT mysql.user # 2020-02-28T13:46:10 00:31 3 SELECT x # 2020-02-28T13:47:00 0:00 1 SELECT mysql.user # 2020-02-28T13:47:06 0:00 1 SELECT x # 2020-02-28T13:47:10 0:00 1 SELECT mysql.user # 2020-02-29T08:25:28 08:37:44 82 SELECT user
若是隻須要時間軸報告,則指定--no-report以取消默認查詢分析報告。不然,時間軸報告將在響應時間配置文件的末尾打印
54,--type:要解析的輸入的日誌類型。容許的類型是:
mysqlbinlog mysql-bin.000441> mysql-bin.000001.txt pt-query-digest --type binlog mysql-bin.000001.txt
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 \ > mysql.tcp.txt pt-query-digest --type tcpdump mysql.tcp.txt
自行選擇其餘tcpdump參數(例如-s,-c和-i)。結果如:
2009-04-12 09:50:16.804849 IP 127.0.0.1.42167 > 127.0.0.1.3306: tcp 37 0x0000: 4508 0059 6eb2 4000 4006 cde2 7f00 0001 0x0010: ....
注意:tcpdump的-c選項能夠在捕獲必定數量的數據包後中止!這對於測試tcpdump命令很是有用。請注意,tcpdump沒法捕獲Unix套接字上的流量。
tcpdump -i any -s 65535 -x -n -q -tttt \ 'port 3306 and tcp[1] & 7 == 2 and tcp[3] & 7 == 2'
在tcpdump輸出中會自動檢測在端口3306上運行的全部MySQL服務器。所以,若是tcpdump out包含來自端口3306上多個服務器的數據包(例如10.0.0.1:330六、10.0.0.2:3306等),則來自全部這些服務器的全部數據包/查詢將被一塊兒分析,就像它們是一臺服務器。若是要分析未在端口3306上運行的MySQL服務器的流量,請參閱--watch-server。
另請注意,在解析tcpdump輸出時,pt-query-digest可能沒法報告數據庫中的查詢。僅在新客戶端的初始鏈接事件中或執行<USE db>時發現數據庫。若是tcpdump輸出中都不包含這些內容,則pt-query-digest沒法發現數據庫。
SELECT c FROM t WHERE id=1 /* Hello, world! */ SELECT * FROM t2 LIMIT 1 INSERT INTO t (a, b) VALUES ('foo', 'bar') INSERT INTO t SELECT * FROM monkeys
因爲rawlog沒有任何指標,所以pt-query-digest的許多功能都沒法使用。當惟一可用的信息是查詢列表時,按計數對查詢進行排名,如經過輪詢SHOW PROCESSLIST進行。
55,--user:縮寫-u,鏈接用戶。
56,--variations:報告這些屬性值的變化數量。顯示一個類在一個屬性中有多少個不一樣的值。 此選項的一般值爲arg,它顯示該類中有多少個不一樣的查詢。 這對於肯定查詢的可緩存性頗有用。
57,--watch-server:針對--type tcpdump使用,在解析tcpdump時要監視哪一個服務器IP地址和端口(如「 10.0.0.1:3306」),全部其餘服務器都將被忽略。 若是未指定,則經過使用端口3306或「mysql」查找任何IP地址來監視全部服務器。若是要監視混合服務器,其中一些服務器在標準端口3306上運行,而另外一些服務器在非標準端口上運行,則須要爲非標準端口服務器建立單獨的tcpdump輸出,而後爲每一個服務器指定此選項。
58,--version:顯示版本並退出。
59,--[no]version-check:是否檢查最新版本,默認檢查。
60,--[no]vertical-format:是否垂直格式,報告的SQL查詢中輸出尾隨的「 G」。
用於建立DSN, DSN選項以逗號分隔,每一個選項都相似於option = value。 區分大小寫,不能有空格,而且若是值包含空格,則必須將其引發來。各個選項說明以下:
本文介紹了pt-query-digest的使用、各個模式、參數的說明,更多具體的信息能夠見官網說明。關於一些平常的使用方法還沒說明,因爲篇幅的問題,將放到下一篇文章裏說明。