天天看點

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

背景:

        做為一個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

percona-toolkit 之 【pt-query-digest】介紹
percona-toolkit 之 【pt-query-digest】介紹
--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。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。 區分大小寫,不能有空格,并且如果值包含空格,則必須将其引起來。各個選項說明如下:

  1. A:預設字元集
  2. D:連接配接到MySQL時要使用的預設資料庫。
  3. F:從給定檔案中讀取預設選項。
  4. h:連接配接到主機的位址。
  5. p:連接配接使用的密碼,如果密碼包含逗号,則必須使用反斜杠将其轉義。
  6. P:用于連接配接的端口号。
  7. S:連接配接的套接字檔案。
  8. t:指定--review或--history表名。
  9. u:連接配接的使用者。

總結

本文介紹了pt-query-digest的使用、各個模式、參數的說明,更多具體的資訊可以見官網說明。關于一些日常的使用方法還沒說明,由于篇幅的問題,将放到下一篇文章裡說明。

~~~~~~~~~~~~~~~

萬物之中,希望至美

~~~~~~~~~~~~~~~