背景:
做為一個MySQL DBA,分析慢查詢是日常主要的工作之一,之前一直使用mysqlsla作為分析慢查詢的, 因為簡單並且也能滿足自己對慢查詢分析的要求,對於另一個工具pt-query-digest並不熟悉,對於pt系列的工具之前也介紹過一些,Percona Toolkit確實厲害,整個全家桶:包含了備份、監控、各種分析工具,以及定制化過的MySQL Server。 現在本文來介紹下如何使用pt-query-digest,也方便自己查閱。
很多人都把pt-query-digest作為分析mysql工具的首選,因為它可以從logs、processlist、和tcpdump 來分析MySQL的狀況,logs包括slow log、general log、binlog。也可以把分析結果輸出到文件中,或則把文件寫到表中。分析過程是先對查詢語句的條件進行參數化,然后對參數化以后的查詢進行分組統計,統計出各查詢的執行時間、次數、占比等,可以借助分析結果找出問題進行優化。
使用方法:
下載:
進入到下載頁,下載Percona Toolkit
依賴包:
Centos:
yum -y install perl-TermReadKey perl-Time-HiRes perl-IO-Socket-SSL.noarch
使用方法:
pt-query-digest [OPTIONS] [FILES] [DSN]
說明:
pt-query-digest分析slow log、general log和binary log,還可以分析來自SHOW PROCESSLIST的查詢和來自tcpdump的MySQL協議數據。 默認情況下,查詢按fingerprint分組,並按查詢時間的降序排列(最慢的查詢排在第一位)。 如果未提供文件,則該工具讀取STDIN。 可選的DSN用於某些選項,例如--since和--until。
示例:
1)從slow.log報告最慢的查詢
pt-query-digest slow.log
2)從host1上的processlist里報告最慢的查詢
pt-query-digest --processlist h=host1
3)使用tcppdump捕獲MySQL協議數據,然后報告最慢的查詢
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之類的選項來創建更復雜和定制的報告。
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。160665表示在文本中的偏移量,可以利用偏移量到慢查詢日志里定位具體的sql語句,定位方法如下:
tail -c +160665 /path/to/slow.log. | head
如果想打印出特定查詢的每個樣本:去掉查詢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查詢,並將其添加到下面。
QUERY REVIEW
--review是存儲所有已分析的查詢,可以將元數據添加到查詢類別中,例如將其標記為后續跟蹤,為查詢添加注釋或為問題跟蹤系統使用問題ID標記它們。可以存儲歷史數據,例如行數,查詢時間以及通常可以在報告中看到的任何內容。
要使用此功能,請使用--review選項運行pt-query-digest。它將指紋和其他信息存儲到指定的表中。下次使用相同的選項運行它時,它將執行以下操作:
- 不會顯示已審核的查詢。如果為review_by列設置了值,則認為該查詢已被審核。 (如果想查看已經查看過的查詢,請使用--report-all選項。)
- 已查看但未出現在輸出中的查詢將導致每個段落第一行中查詢編號序列的空白。--limit指定的值仍然會被接受。因此,如果看了前10名中的所有查詢並要求輸入前10名,則輸出中將看不到任何內容。
- 如果想查看已經查看過的查詢,可以指定--report-all。然后,將看到正常的分析輸出,但還將看到執行時間圖下方的審閱表中的信息。例如:
# 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
此元數據很有用,因為當分析查詢時,會將注釋直接集成到報告中。
FINGERPRINTS
簡而言之就是將將相似的查詢分組在一起,如:
SELECT name, password FROM user WHERE id='12823'; select name, password from user where id=5;
可以合並當成:
select name, password from user where id=?
參數說明: pt-query-digest --help

--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”。
- 只返回指定類型的查詢,如返回select的查詢:
--filter '$event->{arg} =~ m/^select/i' --filter '$event->{fingerprint} =~ m/^select/i'
- 只返回指定用戶的查詢,如返回zhou用戶的查詢:
--filter '$event->{user} =~ m/^zhou/i' --filter '($event->{user} || "") =~ m/^zhou/i'
- 只返回指定IP的查詢,如返回192.168.163.111的查詢:
--filter '($event->{host} || $event->{ip} || "") =~ m/^192.168.163.111/i'
- 只返回指定DB的查詢,如返回zhoujinyi DB的查詢:
--filter '($event->{db} || "") =~ m/^zhoujinyi/i'
- 返回指定DB和類型的查詢,如返回zhoujinyi DB中的select查詢:
--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 ...
可選值還有:
- fingerprint:指紋,將查詢抽象為規范形式,然后用於將event分組到一個類中。
- tables:按表的形式返回報告信息。
- distill:超級指紋,將查詢分解為對它們執行操作的建議。
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。0%表示輸出所有,不做限制。將輸出限制為給定的百分比或行數。如果參數是整數,則僅報告前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。可選值有:
- clock:指定--run-time的實際時間,期間為每個--iterations運行該值。
- event:指定日志時間,日志時間由日志中的時間戳確定。會記住所看到的第一個時間戳,並將此后的每個時間戳與第一個時間戳進行比較,以確定經過了多少日志時間。如看到的第一個時間戳是12:00:00,下一個是12:01:30,則這是1分鍾30秒的日志時間。該工具將讀取事件,直到日志時間大於或等於指定的--run-time值為止。
- interval:指定將event划分為多個日志時間並生成報告的日志時間間隔邊界。
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:要解析的輸入的日志類型。允許的類型是:
- binlog:二進制日志,解析一個二進制日志文件,該文件首先使用mysqlbinlog轉換為文本。
mysqlbinlog mysql-bin.000441> mysql-bin.000001.txt pt-query-digest --type binlog mysql-bin.000001.txt
- genlog:解析MySQL general log 文件。 general log 缺少很多“屬性”,如Query_time,所以默認把 --order-by 更改為Query_time:cnt。
- slowlog:解析MySQL格式的慢查詢文件。
- tcpdump:檢查網絡數據包並解碼MySQL客戶端協議,從中分析查詢和響應。它不會監視網絡,只解析tcpdump的輸出。使用以下參數來格式化輸入:-x -n -q -tttt。如:
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:3306、10.0.0.2:3306等),則來自所有這些服務器的所有數據包/查詢將被一起分析,就像它們是一台服務器。如果要分析未在端口3306上運行的MySQL服務器的流量,請參閱--watch-server。
另請注意,在解析tcpdump輸出時,pt-query-digest可能無法報告數據庫中的查詢。僅在新客戶端的初始連接事件中或執行<USE db>時發現數據庫。如果tcpdump輸出中都不包含這些內容,則pt-query-digest無法發現數據庫。
- rawlog:不是MySQL日志,而是簡單的文本文件,每行只有一條SQL語句,例如:
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, DSN選項以逗號分隔,每個選項都類似於option = value。 區分大小寫,不能有空格,並且如果值包含空格,則必須將其引起來。各個選項說明如下:
- A:默認字符集
- D:連接到MySQL時要使用的默認數據庫。
- F:從給定文件中讀取默認選項。
- h:連接到主機的地址。
- p:連接使用的密碼,如果密碼包含逗號,則必須使用反斜杠將其轉義。
- P:用於連接的端口號。
- S:連接的套接字文件。
- t:指定--review或--history表名。
- u:連接的用戶。
總結
本文介紹了pt-query-digest的使用、各個模式、參數的說明,更多具體的信息可以見官網說明。關於一些日常的使用方法還沒說明,由於篇幅的問題,將放到下一篇文章里說明。