Percona Toolkit 神器全攻略(監控類)
Percona Toolkit 神器全攻略系列共八篇,前文回顧:
前文回顧 |
---|
Percona Toolkit 神器全攻略 |
Percona Toolkit 神器全攻略(實用類) |
Percona Toolkit 神器全攻略(配置類) |
全文約定:
$
為命令提示符、greatsql>
為GreatSQL資料庫提示符。在後續閱讀中,依據此約定進行理解與操作
監控類
在Percona Toolkit中監控類共有以下工具
pt-deadlock-logger
:提取和記錄MySQL/GreatSQL死鎖pt-fk-error-logger
:提取和記錄外來鍵資訊pt-mext
:並行檢視status樣本資訊pt-query-digest
:分析查詢日誌,併產生報告pt-mongodb-summary
:收集有關 MongoDB 叢集的資訊pt-pg-summary
:收集有關 PostgreSQL 叢集的資訊
pt-deadlock-logger
概要
提取和記錄MySQL/GreatSQL死鎖
用法
- pt-deadlock-logger [OPTIONS] DSN
記錄 MySQL/GreatSQL 死鎖的資訊。資訊列印到 STDOUT
,也可以透過指定 --dest
儲存到表中。除非指定 --run-time
或 --iterations
,否則該工具將永遠執行
選項
該工具所有選項如下
引數 | 含義 |
---|---|
--ask-pass | 連線 MySQL/GreatSQL 時提示輸入密碼 |
--charset | 字符集 |
--clear-deadlocks | 建立一個小的死鎖。利用新產生的這個死鎖重新整理Engine InnoDB Status 中的死鎖資訊,間接達到清除Engine InnoDB Status 中大的死鎖資訊的結果,表名為percona_schema.clear_deadlocks 這個表一定不能存在,指令碼會自動建立表並在生成死鎖後刪除表,建表語句CREATE TABLE percona_schema.clear_deadlocks (a INT PRIMARY KEY) ENGINE=InnoDB |
--columns | 結果集欄位 |
--config | 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項 |
--create-dest-table | 建立--dest 指定的表 |
--daemonize | 後臺執行 |
--database | 連線到該資料庫 |
--defaults-file | 只從給定檔案中讀取 MySQL/GreatSQL 選項 |
--dest | 用DSN的格式寫儲存死鎖的位置,至少要指定庫和表 |
--help | 顯示幫助 |
--host | 連線到主機 |
--interval | 檢查死鎖的頻率,如果未指定,將預設永遠執行 |
--iterations | 檢查死鎖的次數,預設情況下,如果沒指定,則為無限次數,退出的時間由--run-time 來限制 |
--log | 守護程序時將所有輸出列印到此檔案。 |
--numeric-ip | 將 IP 地址表示為整數。 |
--password | 用於連線的密碼 |
--pid | 建立給定的 PID 檔案 |
--port | 用於連線的埠號 |
--quiet | 不要死鎖,僅將錯誤和警告列印到STDERR |
--run-time | 退出前要跑多長時間。預設情況下永遠執行,每 --interval 秒檢查一次死鎖。 |
--set-vars | 在這個以逗號分隔的 variable=value 對列表中設定 MySQL/GreatSQL 變數 |
--socket | 用於連線的套接字檔案 |
--tab | 使用製表符而不是空格來分隔列 |
--user | 登入的使用者 |
--version | 顯示版本 |
--[no]version-check | 版本檢查 |
最佳實踐
如果想儲存 pt-deadlock-logger 提取的有關死鎖的所有資訊,建議使用以下表結構:
# 可以根據--columns的欄位進行調整
CREATE TABLE deadlocks (
server char(20) NOT NULL,
ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
thread int unsigned NOT NULL,
txn_id bigint unsigned NOT NULL,
txn_time smallint unsigned NOT NULL,
user char(16) NOT NULL,
hostname char(20) NOT NULL,
ip char(15) NOT NULL, -- alternatively, ip int unsigned NOT NULL
db char(64) NOT NULL,
tbl char(64) NOT NULL,
idx char(64) NOT NULL,
lock_type char(16) NOT NULL,
lock_mode char(1) NOT NULL,
wait_hold char(1) NOT NULL,
victim tinyint unsigned NOT NULL,
query text NOT NULL,
PRIMARY KEY (server,ts,thread)
) ENGINE=InnoDB;
server
:發生死鎖的(源)伺服器ts
:上次檢測到死鎖的日期和時間thread
:GreatSQL執行緒編號,和SHOW FULL PROCESSLIST
中的ID一致txn_id
:InnoDB事務IDtxn_time
:發生死鎖時事務處於活動狀態的時間user
:連線的資料庫使用者名稱hostname
:連線的主機ip
:連線的 IP 地址。如果指定--numeric-ip
,則將轉換為無符號整數db
:發生死鎖的庫tbl
:發生死鎖的表idx
:發生死鎖的索引lock_type
:導致死鎖的鎖上持有的事務的型別lock_mode
:導致死鎖的鎖的鎖定模式wait_hold
:事務是在等待鎖還是持有鎖victim
:事務是否被選為死可回滾的事務並進行回滾query
:導致死鎖的查詢
首先建立上方提供的deadlocks
表,也可以在命令中加入--create-dest-table
自動建立表
greatsql> CREATE TABLE deadlocks (
......中間省略
Query OK, 0 rows affected (0.06 sec)
將host1主機產生的死鎖資訊儲存在host2主機test_db庫下面的deadlocks表中
$ pt-deadlock-logger h=localhost,P=3306,u=root,p='' --dest h=localhost,P=3307,u=root,p='',D=test_db,t=deadlocks
因為沒有指定
--run-time
所以該工具會一直在當前視窗執行,如果要轉到後臺執行可以使用--daemonize
人為製造一個死鎖
session 1 | session 2 |
---|---|
START TRANSACTION; | |
UPDATE t1 SET c2 = 'greatsql' WHERE id = 1; | START TRANSACTION; |
UPDATE t1 SET c2 = 'GreatSQL' WHERE id = 2; | |
UPDATE t1 SET c2 = 'greatsql' WHERE id = 2; | |
UPDATE t1 SET c2 = 'GreatSQL' WHERE id = 1; | |
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction |
檢視deadlocks
表
+-----------+---------------------+--------+--------+----------+------+-----------+----+---------+-----+---------+-----------+-----------+-----------+--------+--------------------------------------------+
| server | ts | thread | txn_id | txn_time | user | hostname | ip | db | tbl | idx | lock_type | lock_mode | wait_hold | victim | query |
+-----------+---------------------+--------+--------+----------+------+-----------+----+---------+-----+---------+-----------+-----------+-----------+--------+--------------------------------------------+
| localhost | 2024-03-20 15:12:51 | 1216 | 0 | 8 | root | localhost | | test_db | t1 | PRIMARY | RECORD | X | w | 1 | UPDATE t1 SET c2 = 'GreatSQL' WHERE id = 1 |
| localhost | 2024-03-20 15:12:51 | 1230 | 0 | 11 | root | localhost | | test_db | t1 | PRIMARY | RECORD | X | w | 0 | UPDATE t1 SET c2 = 'greatsql' WHERE id = 2 |
+-----------+---------------------+--------+--------+----------+------+-----------+----+---------+-----+---------+-----------+-----------+-----------+--------+--------------------------------------------+
2 rows in set (0.00 sec)
deadlocks
表中記錄了鎖的細節、型別、SQL語句,比起直接看SHOW ENGINE INNODB STATUS
方便
pt-fk-error-logger
概要
pt-fk-error-logger工具的作用和pt-deadlock-logger差不多,pt-fk-error-logger是記錄MySQL/GreatSQL外來鍵錯誤資訊。
用法
- pt-fk-error-logger [OPTIONS] [DSN]
記錄有關給定 DSN 上的外來鍵錯誤的資訊。資訊列印到 STDOUT
,也可以透過指定 --dest
儲存到表中。除非指定 --run-time
或 --iterations
,否則該工具將永遠執行。
選項
該工具所有選項如下
引數 | 含義 |
---|---|
--ask-pass | 連線 MySQL/GreatSQL 時提示輸入密碼 |
--charset | 字符集 |
--config | 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項 |
--daemonize | 後臺執行 |
--database | 連線到該資料庫 |
--defaults-file | 只從給定檔案中讀取 MySQL/GreatSQL 選項 |
--dest | 用DSN的格式寫儲存死鎖的位置,至少要指定庫和表 |
--help | 顯示幫助 |
--host | 連線到主機 |
--interval | 檢查死鎖的頻率,如果未指定,將預設永遠執行 |
--iterations | 檢查死鎖的次數,預設情況下,如果沒指定,則為無限次數,退出的時間由--run-time 來限制 |
--log | 守護程序時將所有輸出列印到此檔案。 |
--password | 用於連線的密碼 |
--pid | 建立給定的 PID 檔案 |
--port | 用於連線的埠號 |
--quiet | 不要死鎖,僅將錯誤和警告列印到STDERR |
--run-time | 退出前要跑多長時間。預設情況下永遠執行,每 --interval 秒檢查一次死鎖。 |
--set-vars | 在這個以逗號分隔的 variable=value 對列表中設定 MySQL/GreatSQL 變數 |
--socket | 用於連線的套接字檔案 |
--user | 登入的使用者 |
--version | 顯示版本 |
--[no]version-check | 版本檢查 |
最佳實踐
如果想儲存 pt-fk-error-logger 可以提取的有關死鎖的所有資訊,建議使用以下表結構:
CREATE TABLE foreign_key_errors (
ts datetime NOT NULL,
error text NOT NULL,
PRIMARY KEY (ts)
);
ts
:記錄時間error
:錯誤描述
將host1主機產生的違反外來鍵約束資訊儲存在host2主機test_db庫下面的foreign_key_errors表中
$ pt-fk-error-logger h=localhost,P=3306,u=root,p='',S=/data/GreatSQL01/mysql.sock --dest h=localhost,P=3307,u=root,p='',S=/data/GreatSQL02/mysql.sock,D=test_db,t=foreign_key_errors
人為建立違反索引約束
# 建t_fk1表
CREATE TABLE `t_fk1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`k` int unsigned NOT NULL DEFAULT '0',
`c` char(20) NOT NULL DEFAULT '',
`pad` char(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k_2` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 建t_fk2表
CREATE TABLE `t_fk2` (
`id1` int unsigned NOT NULL AUTO_INCREMENT,
`id2` int unsigned NOT NULL,
PRIMARY KEY (`id1`),
KEY `id2` (`id2`),
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`id2`) REFERENCES `t1` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
往t_fk1表插入資料
greatsql> insert into t_fk1 values(1,1,'a','a');
greatsql> insert into t_fk1 values(2,2,'b','b');
greatsql> insert into t_fk1 values(3,3,'c','c');
往t_fk2表插入資料
greatsql> insert into t_fk2 values(5,5);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test_db`.`t_fk2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`id2`) REFERENCES `t1` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE)
檢視foreign_key_errors
表
greatsql> select * from foreign_key_errors\G
*************************** 1. row ***************************
ts: 2024-03-20 16:21:51
error: 140628737369792 Transaction:
TRANSACTION 21974, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1128, 1 row lock(s), undo log entries 1
MySQL thread id 1235, OS thread handle 140628737369792, query id 90865 localhost root update
insert into t_fk2 values(5,5)
Foreign key constraint fails for table `test_db`.`t_fk2`:
,
CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`id2`) REFERENCES `t1` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
Trying to add in child table, in index id2 tuple:
DATA TUPLE: 2 fields;
0: len 4; hex 00000005; asc ;;
1: len 4; hex 00000005; asc ;;
But in parent table `test_db`.`t1`, in index PRIMARY,
the closest match we can find is record:
PHYSICAL RECORD: n_fields 5; compact format; info bits 0
0: len 4; hex 00000006; asc ;;
1: len 6; hex 000000004339; asc C9;;
2: len 7; hex 82000003cb0110; asc ;;
3: len 4; hex 000f5bcd; asc [ ;;
4: len 17; hex 3139323639362e36393136393235323433; asc 192696.6916925243;;
1 row in set (0.00 sec)
該表中很清晰的記錄了在t_fk2
表的id2
欄位中嘗試插入值5
,但是根據外來鍵約束t2_ibfk_1
,這個值必須在t1
表的id
欄位中存在。
pt-mext
概要
並排檢視 MySQL/GreatSQL SHOW GLOBAL STATUS
的例子
用法
- pt-mext [OPTIONS] -- COMMAND
選項
該工具所有選項如下
引數 | 含義 |
---|---|
--help | 顯示幫助 |
--relative | 從前一列中減去每一列 |
--version | 顯示版本 |
最佳實踐
$ pt-mext -r -- mysqladmin ext -i10 -c3
Aborted_clients 84 0
Aborted_connects 18 0
Acl_cache_items_count 0 0
Binlog_cache_disk_use 15 0
Binlog_cache_use 118 0
······下方省略
-
-i10
:採集間隔 -
-c5
:採集次數 -
-r
:相對的
上述命令中會有三次迭代,但只會輸出第一次的結果,第二次和第一次相差的結果。意味著這會詳細的列出每個變數在這一階段的一個初始值(第一列)以及每兩個取樣點的差異值。
上面例子中Aborted_clients
中的84是取樣的初始值,後面的0是每兩個取樣點的差異值。
pt-query-digest
概要
pt-query-digest是用於分析 MySQL/GreatSQL 慢查詢的一個工具,它可以分析Binlog、General log、Slowlog,也可以透過SHOWPROCESSLIST或者透過tcpdump抓取的 MySQL/GreatSQL 協議資料來進行分析。可以把分析結果輸出到檔案中,分析過程是先對查詢語句的條件進行引數化,然後對引數化以後的查詢進行分組統計,統計出各查詢的執行時間、次數、佔比等,可以藉助分析結果找出問題進行最佳化。
用法
- pt-query-digest [OPTIONS] [FILES] [DSN]
選項
該工具所有選項如下
引數 | 含義 |
---|---|
--ask-pass | 連線 MySQL/GreatSQL 時提示輸入密碼 |
--attribute-aliases | 屬性列表別名等 |
--attribute-value-limit | 屬性值的健全限制 |
--charset | 字符集 |
--config | 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項 |
--[no]continue-on-error | 即使出現錯誤也繼續解析 |
--[no]create-history-table | 如果 --history 表不存在,則建立 |
--[no]create-review-table | 如果 --review 表不存在,則建立它 |
--daemonize | 後臺執行 |
--database | 連線到該資料庫 |
--defaults-file | 只從給定檔案中讀取 MySQL/GreatSQL 選項 |
--embedded-attributes | 兩個Perl正規表示式模式,用於捕獲查詢中嵌入的偽屬性 |
--expected-range | 當數量多於或少於預期時解釋專案(預設值為5,10) |
--explain | 使用此 DSN 執行示例查詢的 EXPLAIN 並列印結果 |
--filter | 丟棄此Perl程式碼未返回true的事件 |
--group-by | 按事件的哪個屬性進行分組 |
--help | 顯示幫助 |
--history | 在給定表中儲存每個查詢類的指標 |
--host | 連線到主機 |
--ignore-attributes | 不要聚合這些屬性 |
--inherit-attributes | 如果缺少,則從具有這些屬性的最後一個事件繼承這些屬性 |
--interval | 檢查的頻率 |
--iterations | 迭代收集和報告週期的次數。如果沒指定,則為無限次數,退出的時間由--run-time 來限制 |
--limit | 限制輸出結果百分比或數量,預設值是20,即輸出最慢的20條語句 |
--log | 守護程序時將所有輸出列印到此檔案 |
--max-hostname-length | 將報告中的主機名刪減至此長度 |
--max-line-length | 將行設定長度 |
--order-by | 按此屬性和聚合函式對事件進行排序 |
--outliers | 按屬性報告異常值 |
--output | 如何格式化並列印查詢分析結果 |
--password | 用於連線的密碼 |
--pid | 建立給定的 PID 檔案 |
--port | 用於連線的埠號 |
--preserve-embedded-numbers | 加密查詢時保留資料庫/表名稱中的數字 |
--processlist | 輪詢此 DSN 的程序列表以進行查詢,其間有 --interval 睡眠 |
--progress | 將進度報告列印到 STDERR |
--read-timeout | 等待來自輸入的事件這麼長時間; 0 永遠等待 |
--[no]report | 列印每個 --group-by 屬性的查詢分析報告 |
--report-all | 報告所有查詢,甚至是已經稽核過的查詢 |
--report-format | 列印查詢分析報告的這些部分(rusage,date,hostname,files,header,profile,query_report,prepared) |
--report-histogram | 繪製該屬性值的分佈圖 |
--resume | 將最後一個檔案偏移量(如果有)寫入給定的檔名 |
--review | 儲存查詢類以供以後檢視,並且不要報告已檢視的類 |
--run-time | 每個 --iterations 執行多長時間,預設永遠執行 |
--run-time-mode | 設定 --run-time 值的作用物件 |
--sample | 過濾掉除每個查詢的前 N 個出現之外的所有查詢 |
--slave-user | 設定用於連線從庫的使用者 |
--slave-password | 設定用於連線從庫的密碼 |
--set-vars | 以逗號分隔的 variable=value 對列表中設定 MySQL/GreatSQL 變數 |
--show-all | 顯示這些屬性的所有值 |
--since | 僅解析比該值更新的查詢(解析自該日期以來的查詢) |
--socket | 用於連線的套接字檔案 |
--timeline | 顯示事件的時間表 |
--type | 要解析的輸入型別 |
--until | 截止時間,配合since可以分析一段時間內的慢查詢 |
--user | 登陸的使用者 |
--variations | 報告這些屬性值的變化數量 |
--version | 顯示版本 |
--[no]version-check | 版本檢查 |
--[no]vertical-format | 垂直輸出SQL結果 |
--watch-server | 在解析 tcpdump 時要監視哪個伺服器 IP 地址和埠(如“10.0.0.1:3306”)(對於 --type tcpdump);所有其他伺服器都將被忽略 |
最佳實踐
直接分析慢查詢日誌
$ pt-query-digest ./slow.log
第一部分
# 使用者時間,系統時間,實體記憶體佔用大小,虛擬記憶體佔用大小
170ms user time, 0 system time, 29.88M rss, 38.17M vsz
# 執行工具的時間
Current date: Thu Mar 21 10:13:18 2024
# 主機名
Hostname: myarch
# 被分析的檔名字
Files: ./slow.log
# 語句總數量,唯一的語句數量,QPS,併發數
Overall: 119 total, 18 unique, 0.00 QPS, 0.00x concurrency _____________
# 日誌記錄時間範圍
Time range: 2024-03-08T09:52:08 to 2024-03-20T14:37:23
# 屬性 總計 最小 最大 平均 95% 標準 中位數
Attribute total min max avg 95% stddev median
============ ======= ======= ======= ======= ======= ======= =======
Exec time 122s 189us 44s 1s 1s 6s 384us
Lock time 489us 0 198us 4us 6us 17us 1us
Rows sent 1.10M 0 535.35k 9.44k 1.26k 68.78k 97.36
Rows examine 97.56M 102 35.09M 839.55k 961.27k 4.59M 97.36
Rows affecte 0 0 0 0 0 0 0
Bytes sent 285.10M 56 202.68M 2.40M 9.76M 18.45M 5.45k
Query size 15.50k 30 250 133.39 202.40 52.84 143.84
......下方省略
- unique:唯一查詢數量,即對查詢條件進行引數化以後,總共有多少個不同的查詢
- 95%:把所有值從小到大排列,位置位於95%的那個數
- median:中位數,把所有值從小到大排列,位置位於中間那個數
如果沒有命令hostname可能會導致報錯
error: Can't exec "hostname"
此時下載inetutils
即可,因本文使用arch系統,該系統比較乾淨,所以導致報錯。
第二部分
Profile
Rank Query ID Response time Calls R/Call V/M Item
==== =================================== ============= ===== ======= ==== ========
1 0x4029831C8032DEE4724E42576E2C52A6 83.1656 68.2% 2 41.5828 0.37 SELECT tpch.lineitem
2 0x6472467F1FD96D847221959F021B8110 22.8429 18.7% 1 22.8429 0.00 SELECT xxl_job_log
3 0x34BC467D466B794E79C020BEF3BFFE95 6.3289 5.2% 7 0.9041 1.17 SELECT test_index
4 0x14810CF629251E9A8950ED961EA04448 4.3492 3.6% 6 0.7249 0.06 SELECT test_db.xxl_job_log
這部分對查詢進行引數化並分組,然後對各類查詢的執行情況進行分析,結果按總執行時長,從大到小排序。
- Response:總響應時間
- time:該查詢在本次分析中總的時間佔比
- Calls:執行次數,即本次分析總共有多少條這種型別的查詢語句
- R/Call:平均每次執行的響應時間
- V/M:響應時間Variance-to-mean的比率
- Item:查詢物件
第三部分
此部分列出了第一個查詢的詳細統計結果,列出了執行次數、最大、最小、平均、95%、標準、中位數的統計
Query 1: 0.02 QPS, 0.92x concurrency, ID 0x4029831C8032DEE4724E42576E2C52A6 at byte 1789
This item is included in the report because it matches --limit.
Scores: V/M = 0.37
Time range: 2024-03-08T09:53:37 to 2024-03-08T09:55:07
Attribute pct total min max avg 95% stddev median
============ === ======= ======= ======= ======= ======= ======= =======
Count 1 2
Exec time 68 83s 39s 44s 42s 44s 4s 42s
Lock time 2 11us 5us 6us 5us 6us 0 5us
Rows sent 0 273 133 140 136.50 140 4.95 136.50
Rows examine 71 70.19M 35.09M 35.09M 35.09M 35.09M 0 35.09M
Rows affecte 0 0 0 0 0 0 0 0
Bytes sent 0 38.41k 18.81k 19.60k 19.20k 19.60k 567.10 19.20k
Query size 0 98 49 49 49 49 0 49
String:
Databases test_db
End 2024-03-08... (1/50%), 2024-03-08... (1/50%)
Hosts localhost
Start 2024-03-08... (1/50%), 2024-03-08... (1/50%)
Users root
Query_time distribution
1us
10us
100us
1ms
10ms
100ms
1s
10s+ ################################################################
Tables
SHOW TABLE STATUS FROM `tpch` LIKE 'lineitem'\G
SHOW CREATE TABLE `tpch`.`lineitem`\G
EXPLAIN /*!50100 PARTITIONS*/
select * from tpch.lineitem where l_suppkey=23045\G
-
Exec time:表示查詢的執行時間
-
Lock time:表示查詢在等待鎖的時間
-
Rows sent:表示查詢返回的行數
-
Rows examined:表示查詢掃描的行數
-
Rows affected:表示查詢影響的行數
-
Bytes sent:表示查詢傳送的位元組數
-
Query size:表示查詢的大小
-
Query_time distribution:查詢時間的分佈,可以看到這個SQL查詢執行時間都是10秒以上
-
Tables:該SQL查詢涉及的表
-
EXPLAIN:查詢的SQL語句
分析指定時間內的查詢
分析12小時內的查詢
$ pt-query-digest --since=12h ./slow.log
分析指定時間段內的查詢
$ pt-query-digest slow.log --since '2024-03-19 00:00:00' --until '2024-03-21 23:59:59'
分析指含有查詢語句的慢查詢
$ pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log
分析指定使用者的查詢
修改m/^root/i'
中的root換成對應使用者即可
$ pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log
分析其他日誌
分析binlog
分析前要先解析
$ mysqlbinlog binlog.000023 > binlog.000023.sql
$ pt-query-digest --type=binlog binlog.000023.sql > binlog_analysis.log
分析general log
$ pt-query-digest --type=genlog general.log > general_analysis.log
查詢結果儲存到表
把查詢儲存到query_review表或query_review_history表,先來檢視下query_review表結構
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
)
把查詢儲存到query_review表,使用--create-review-table
會自動建立
$ pt-query-digest --user=root,-password='' --review h=localhost,D=test_db,t=query_review --create-review-table slow.log
分析tcpdump抓取的資料
$ tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > GreatSQL.tcp.txt
$ pt-query-digest --type tcpdump GreatSQL.tcp.txt> tcp_analysis.log
如果沒有tcpdump,請手動安裝
本文完 😃 下章節將介紹Percona Toolkit 神器全攻略(系統類)
Enjoy GreatSQL 😃
關於 GreatSQL
GreatSQL是適用於金融級應用的國內自主開源資料庫,具備高效能、高可靠、高易用性、高安全等多個核心特性,可以作為MySQL或Percona Server的可選替換,用於線上生產環境,且完全免費併相容MySQL或Percona Server。
相關連結: GreatSQL社群 Gitee GitHub Bilibili
GreatSQL社群:
社群部落格有獎徵稿詳情:https://greatsql.cn/thread-100-1-1.html
技術交流群:
微信:掃碼新增
GreatSQL社群助手
微信好友,傳送驗證資訊加群
。