當你的性能瓶頸卡在數據庫這塊的時候,能夠經過percona-toolkit來進行問題定位。mysql
那麼,首先,介紹下percona-toolkit。percona-toolkit是一組高級命令行工具的集合,用來執行各類經過手工執行很是複雜和麻煩的mysql和系統任務,這些任務包括:sql
1)檢查master和slave數據的一致性數據庫
2)有效地對記錄進行歸檔服務器
3)查找重複的索引併發
4)對服務器信息進行彙總tcp
5)分析來自日誌和tcpdump的查詢工具
6)當系統出問題的時候收集重要的系統信息性能
percona-toolkit源自Maatkit 和Aspersa工具,這兩個工具是管理mysql的最有名的工具,如今Maatkit工具已經不維護了,因此使用percona-toolkit吧!spa
1、percona-toolkit工具包的安裝命令行
1) percona的安裝十分簡單,去percona的官網下載percona-toolkit:
https://www.percona.com/downloads/percona-toolkit/
2) 在雲主機中進行解壓:tar -xvf percona-toolkit_2.2.15-2.tar.gz
3) 進入到解壓後的目錄 /percona-toolkit-2.2.16/bin 中,就有咱們須要的各類有用命令工具
4) 安裝完成後,能夠用如下命令來確認是否安裝成功
# pt-query-digest --help
# pt-table-checksum –help
2、percona-toolkit命令使用說明
percona-toolkit有32個命令,能夠分爲7大類,詳細見下表:
工具類別 |
工具命令 |
工具做用 |
備註 |
開發類 |
pt-duplicate-key-checker |
列出並刪除重複的索引和外鍵 |
|
pt-online-schema-change |
在線修改表結構 |
|
|
pt-show-grants |
規範化和打印權限 |
|
|
pt-upgrade |
在多個服務器上執行查詢,並比較不一樣 |
|
|
性能類 |
pt-index-usage |
分析日誌中索引使用狀況,並出報告 |
|
pt-pmp |
爲查詢結果跟蹤,並彙總跟蹤結果 |
|
|
pt-visual-explain |
格式化執行計劃 |
|
|
pt-table-usage |
分析日誌中查詢並分析表使用狀況 |
pt 2.2新增命令 |
|
配置類 |
pt-config-diff |
比較配置文件和參數 |
|
pt-mysql-summary |
對mysql配置和status進行彙總 |
|
|
pt-variable-advisor |
分析參數,並提出建議 |
|
|
監控類 |
pt-deadlock-logger |
提取和記錄mysql死鎖信息 |
|
pt-fk-error-logger |
提取和記錄外鍵信息 |
|
|
pt-mext |
並行查看status樣本信息 |
|
|
pt-query-digest |
分析查詢日誌,併產生報告 |
經常使用命令 |
|
複製類 |
pt-heartbeat |
監控mysql複製延遲 |
|
pt-slave-delay |
設定從落後主的時間 |
|
|
pt-slave-find |
查找和打印全部mysql複製層級關係 |
|
|
pt-slave-restart |
監控salve錯誤,並嘗試重啓salve |
|
|
pt-table-checksum |
校驗主從複製一致性 |
|
|
pt-table-sync |
高效同步表數據 |
|
|
系統類 |
pt-diskstats |
查看系統磁盤狀態 |
|
pt-fifo-split |
模擬切割文件並輸出 |
|
|
pt-summary |
收集和顯示系統概況 |
|
|
pt-stalk |
出現問題時,收集診斷數據 |
|
|
pt-sift |
瀏覽由pt-stalk建立的文件 |
pt 2.2新增命令 |
|
pt-ioprofile |
查詢進程IO並打印一個IO活動表 |
pt 2.2新增命令 |
|
實用類 |
pt-archiver |
將表數據歸檔到另外一個表或文件中 |
|
pt-find |
查找表並執行命令 |
|
|
pt-kill |
Kill掉符合條件的sql |
經常使用命令 |
|
pt-align |
對齊其餘工具的輸出 |
pt 2.2新增命令 |
|
pt-fingerprint |
將查詢轉成密文 |
pt 2.2新增命令 |
本文中主要解鎖了pt-query-digest這個命令,其餘命令還待解鎖。
3、結合tcpdump命令一塊兒定位問題
1) 用tcpdump命令抓包,抓取須要操做數據的包,本文中以數據庫地址爲10.165.182.2:3306爲例進行說明:
sudo tcpdump -s 65535 -x -nn -q -tttt -i any -c 100000 port 3306 > mysql.tcp.txt
2) 採用pt-query-digest分析查詢日誌,併產生報告:
./pt-query-digest --type tcpdump --watch-server 10.165.182.2:3306 ../../mysql.tcp.txt > ~/sql.txt
3) 查看sql.txt這個文檔
4、Percona的報告解讀
上面第三部分的步驟2產生的percona的報告以下:
1. 整體統計結果,以下圖
Overall: 總共有多少條查詢,上例爲總共3.33k個查詢。
Time range: 查詢執行的時間範圍。
unique: 惟一查詢數量,即對查詢條件進行參數化之後,總共有多少個不一樣的查詢,該例爲10。
total: 總計 min:最小 max: 最大 avg:平均
95%: 把全部值從小到大排列,位置位於95%的那個數,這個數通常最具備參考價值。
median: 中位數,把全部值從小到大排列,位置位於中間那個數。
Exec time:語句執行時間
Lock time:鎖佔有時間
Rows sent:發送到客戶端的行數
Row examine:掃描的行數(SELECT語句)
Row affecte:發送改變的行數(UPDATE, DELETE, INSERT語句)
Bytes sent:發送多少bytes的查詢結果集
Query size:查詢語句的字符數
2. 查詢分組統計結果,以下圖
由上圖可見,這部分對查詢進行參數化並分組,而後對各種查詢的執行狀況進行分析,結果按總執行時長,從大到小排序。
Response: 總的響應時間。
time: 該查詢在本次分析中總的時間佔比。
calls: 執行次數,即本次分析總共有多少條這種類型的查詢語句。
R/Call: 平均每次執行的響應時間。
Item : 查詢對象
3. 第三部分:每一種查詢的詳細統計結果,以下圖:
查詢的詳細統計結果,最上面的表格列出了執行次數、最大、最小、平均、95%等各項目的統計。
QPS:每秒查詢數
concurrency:該查詢的近似併發值
ID:16進制,查詢語句的指紋,去掉了多餘空格、和文本字符、轉換成小寫,使用--filter能夠用來進行過濾
at byte 289141:查詢語句在日誌文件中的偏移量(byte offset),不必定精確,根據偏移量在日誌文件中查找語句(如tail -c +289141 mysql-slow.201407250000 |head)
pct在整個日誌文件中,執行語句佔用百分比(91%),總計執行了3055次【本文中的數據】
Databases: 庫名
Users: 各個用戶執行的次數(佔比)
Query_time distribution : 查詢時間分佈, 長短體現區間佔比,本例中1s-10s之間查詢數量是10s以上的兩倍。
Tables: 查詢中涉及到的表
Explain: 示例
因此能夠經過這裏的耗時來定位究竟是哪一個sql語句耗時較長,從而進一步進行定位,看是否因爲缺乏索引等問題形成的耗時較長。