percona-toolkit 之 【pt-query-digest】介紹

背景:

        作爲一個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查詢,並將其添加到下面。

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);其餘全部服務器均被忽略
View Code

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」。

  1. 只返回指定類型的查詢,如返回select的查詢:
    --filter '$event->{arg} =~ m/^select/i'
    --filter '$event->{fingerprint} =~ m/^select/i'
  2. 只返回指定用戶的查詢,如返回zhou用戶的查詢:
    --filter '$event->{user} =~ m/^zhou/i'
    --filter '($event->{user} || "") =~ m/^zhou/i'
  3. 只返回指定IP的查詢,如返回192.168.163.111的查詢:
    --filter '($event->{host} || $event->{ip} || "") =~ m/^192.168.163.111/i'
  4. 只返回指定DB的查詢,如返回zhoujinyi DB的查詢:
    --filter '($event->{db} || "") =~ m/^zhoujinyi/i'
  5. 返回指定DB和類型的查詢,如返回zhoujinyi DB中的select查詢:
    --filter '(($event->{db} || "") =~ m/^mysql/i) && (($event->{fingerprint} || "") =~ m/^select/i)'
  6. ...

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。將輸出限制爲給定的百分比或行數。若是參數是整數,則僅報告前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:330六、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。 區分大小寫,不能有空格,而且若是值包含空格,則必須將其引發來。各個選項說明以下:

  1. A:默認字符集
  2. D:鏈接到MySQL時要使用的默認數據庫。
  3. F:從給定文件中讀取默認選項。
  4. h:鏈接到主機的地址。
  5. p:鏈接使用的密碼,若是密碼包含逗號,則必須使用反斜槓將其轉義。
  6. P:用於鏈接的端口號。
  7. S:鏈接的套接字文件。
  8. t:指定--review或--history表名。
  9. u:鏈接的用戶。

總結

本文介紹了pt-query-digest的使用、各個模式、參數的說明,更多具體的信息能夠見官網說明。關於一些平常的使用方法還沒說明,因爲篇幅的問題,將放到下一篇文章裏說明。

相關文章
相關標籤/搜索