Percona Toolkit 神器全攻略(實用類)

GreatSQL發表於2024-05-29

Percona Toolkit 神器全攻略(實用類)

file

Percona Toolkit 神器全攻略系列共八篇,前文回顧:

前文回顧
Percona Toolkit 神器全攻略

全文約定:$為命令提示符、greatsql>為GreatSQL資料庫提示符。在後續閱讀中,依據此約定進行理解與操作

實用類

在Percona Toolkit中實用類共有以下工具

  • pt-align:將其它工具輸出內容與列對齊

  • pt-archiver:將表中的行存檔到另一個表或檔案中

  • pt-find:查詢表並執行命令

  • pt-fingerprint:將查詢轉成密文

  • pt-kill:Kill掉符合條件的SQL

  • pt-k8s-debug-collector:從 k8s/OpenShift 叢集收集除錯資料(日誌、資源狀態等)

  • pt-secure-collect:收集、清理、打包和加密資料

pt-align

概要

透過讀取行並將其分成單詞的方式來執行列對齊。該工具首先計算每行包含的單詞數量,並嘗試確定是否有一個占主導地位的數字,將其假設為每行的單詞數量。接下來,pt-align會排除所有不符合該數量的行,並將下一行視為第一個非標題行。根據每個單詞是否看起來像數字,它會決定列的對齊方式。最後,工具會遍歷資料集,確定每列的寬度,並將它們格式化列印出來。

這對於調整vmstat或iostat的輸出非常有幫助,使其更易於閱讀。

用法

將其它工具的輸出與列對齊,如果未指定FILES(檔案)則讀取STDIN(輸入)

  • pt-align [FILES]

如果工具列印以下輸出(沒有對齊)

DATABASE TABLE   ROWS
foo      bar      100
long_db_name table  1
another  long_name 500

使用 pt-align 將輸出重新列印為(有對齊)

DATABASE     TABLE     ROWS
foo          bar        100
long_db_name table        1
another      long_name  500

選項

該工具的命令列引數如下

引數 含義
--help 幫助,顯示幫助並退出
--version 版本,顯示版本並推出

最佳實踐

對齊vmstat

當檢視 vmstat 時,有時會遇到列對齊不整齊的情況。此時,可以使用 pt-align 工具來解決這個問題

# 未使用pt-align工具
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 205472 181304     60 948960    0    0     0     1    1    1  1  2 98  0  0

# 使用pt-align工具
$ vmstat | pt-align
r b   swpd   free buff  cache si so bi bo in cs us sy id wa st
2 0 205472 181260   60 948992  0  0  0  1  1  1  1  2 98  0  0

對齊iostat

當檢視 iostat 時,有時會遇到列對齊不整齊的情況。此時,可以使用 pt-align 工具來解決這個問題

# 未使用pt-align工具
$ iostat
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.86    0.00    1.51    0.00    0.00   97.62

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.11         0.33         1.31    6746368   27046909
dm-0              0.09         0.30         1.23    6263958   25261569
dm-1              0.03         0.02         0.09     452072    1782864

# 使用pt-align工具
$ iostat | pt-align
0.86    0.00 1.51      0.00      0.00    97.62   
Device: tps  kB_read/s kB_wrtn/s kB_read kB_wrtn 
sda     0.11 0.33      1.31      6746368 27049993
dm-0    0.09 0.30      1.23      6263958 25264653
dm-1    0.03 0.02      0.09      452072  1782864

pt-archiver

將MySQL/GreatSQL表中的行存檔到另一個表或檔案中

概要

pt-archiver 是一款線上歸檔工具,不會影響生產,但是用此命令操作的表必須要有主鍵,它可以實現如下功能:

  • 歸檔歷史資料
  • 線上刪除大量資料
  • 資料匯出和備份
  • 資料遠端歸檔
  • 資料清理

用法

  • pt-archiver [OPTIONS] --source DSN --where WHERE

將表從oltp例項歸檔到olap的例項中

$ pt-archiver --source h=oltp_server,D=test,t=tbl --dest h=olap_server --file '/var/log/archive/%Y-%m-%d-%D.%t' --where "1=1" --limit 1000 --commit-each

從子表刪除孤立行

$ pt-archiver --source h=host,D=db,t=child --purge --where 'NOT EXISTS(SELECT * FROM parent WHERE col=child.col)'

選項

  • 至少指定 --dest--file--purge 之一

  • 如果 COPY 為 yes, --dest 中的 DSN 值預設為 --source 中的值

部分引數選項存在互斥,不可同時存在,詳見:

選項A 選項B 關係
--ignore --replace 互斥
--txn-size --commit-each 互斥
--low-priority-insert --delayed-insert 互斥
--share-lock --for-update 互斥
--analyze --optimize 互斥
--no-ascend --no-delete 互斥

所有引數選項如下:

引數 含義
--analyze 為d則在dest上使用analyze,為s則在source上使用analyze,ds則表示兩者都執行
--ascend-first 僅升序第一個索引列
--ask-pass 連線 MySQL/GreatSQL 時提示輸入密碼
--buffer 指定file時,僅在事務提交的時候重新整理到磁碟
--bulk-delete 批次刪除
--[no]bulk-delete-limit 是否開啟批次刪除限制,delete ... limit
--bulk-insert 透過LOAD DATA批次插入
--channel 指定複製通道
--charset 字符集
--[no]check-charset 是否檢查字符集,預設檢查
--[no]check-columns 檢查列,確保 --source 和 --dest 具有相同的列
--check-interval 定義歸檔每次暫停多長時間
--check-slave-lag 暫停歸檔,直到此副本的滯後小於--max-lag
--columns 歸檔指定的欄位,逗號分隔
--commit-each 提交每組獲取和歸檔的行,與--limit配合使用
--config 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項
--database 連線到該資料庫
--delayed-insert 將 DELAYED 修飾符新增到 INSERT 或 REPLACE 語句,低優先順序插入。
不過此引數在5.6版本棄用,8.0版本不支援,伺服器識別但忽略DELAYED關鍵字
--dest 此項指定一個表。pt-archiver 將插入從 --source 歸檔的行。 它使用與 --source 相同的 key=val 引數格式。 大多數缺失值預設為與 --source 相同的值,因此您不必重複 --source 和 --dest 中相同的選項。 使用 --help 選項檢視從 --source 複製了哪些值。
--dry-run 列印查詢並退出而不執行任何操作
--file 要存檔到的檔案,%D Database name;%t Table name,時間的格式化如例子中所描述,與--output-format結合使用可以指定輸出的內容是dump(使用製表符作為分隔符)還是csv(使用逗號作為分隔符),與--header配合使用指定是否列印欄位名字在第一行
--for-update 指定加讀鎖還是寫鎖。將 FOR UPDATE 修飾符新增到 SELECT 語句。與--share-lock互斥。
--header 在--file頂部列印列標題
--help 顯示幫助
--high-priority-select 將 HIGH_PRIORITY 修飾符新增到 SELECT 語句。只適用表級別儲存引擎(MyISAM、MEMORY等)
--host 連線到主機
--ignore 忽略在執行INSERT時出現的可忽略錯誤。與--replace互斥
--limit 每個語句要獲取和歸檔的行數。預設為一行
--local 不要將 OPTIMIZE 或 ANALYZE 查詢寫入 binlog
--low-priority-delete 將 LOW_PRIORITY 修飾符新增到 DELETE 語句。此時會延遲執行該 DELETE 直到沒有其他客戶端從表中讀取資料為止。只適用表級別儲存引擎(MyISAM、MEMORY等)
--low-priority-insert 低優先順序插入。只適用表級別儲存引擎(MyISAM、MEMORY等)
--max-flow-ctl 用於pxc叢集的類max-lag引數
--max-lag 暫停校驗和,直到所有副本的滯後小於此值
--no-ascend 不使用升序索引最佳化。和no-delete互斥
--no-delete 不刪除資料。和no-ascend互斥
--optimize 表示執行optimize,使用方式與analyze一致。和analyze互斥
--output-format 與--file一起使用指定輸出格式
--password 連線時使用的密碼
--pid 建立給定的 PID 檔案。如果 PID 檔案已存在且其中包含的 PID 與當前 PID 不同,則該工具將不會啟動。但是,如果 PID 檔案存在並且其中包含的 PID 不再執行,則該工具將使用當前 PID 覆蓋 PID 檔案。工具退出時,PID 檔案會自動刪除
--plugin 用作通用外掛的 Perl 模組名稱
--port 用於連線的埠號
--primary-key-only 僅主鍵列。使用主鍵列指定--columns的快捷方式
--progress 指定多少行列印一次進度資訊
--purge 只清除,不歸檔。最好配合 --primary-key-only 指定表的主鍵列。這將防止無緣無故地從伺服器獲取所有列。
--quick-delete 給DELETE加quick修飾符。使用 QUICK 修飾符時,儲存引擎不會合並索引葉子節點,從而提高刪除操作的速度。只適用表級別儲存引擎(MyISAM、MEMORY等)
--quiet 不輸出任何資訊,包括statistics資訊
--replace 導致--dest中的 INSERT 被寫入 REPLACE。與--ignore互斥
--retries 遇到超時或死鎖的重試次數
--run-time 指定執行時間,s=seconds, m=minutes, h=hours, d=days; 如果不指定用的是s
--[no]safe-auto-increment 不要歸檔具有最大 AUTO_INCRMENT 的行
--sentinel 預設檔案是/tmp/pt-archiver-sentinel,該檔案存在則退出歸檔
--slave-user 從庫使用者
--slave-password 從庫密碼
--set-vars 設定執行時的MySQL/GreatSQL引數
--share-lock 指定加讀鎖還是寫鎖。將 LOCK IN SHARE MODE 修飾符新增到 SELECT 語句。與--for-update互斥
--skip-foreign-key-checks 使用 SET FOREIGN_KEY_CHECKS=0 禁用外來鍵檢查
--sleep 兩次提取中間的休眠時間,預設不休眠
--sleep-coef 指定sleep時間為最後一次 SELECT 時間的多少倍
--socket 用於連線的套接字檔案
--source 對於制動歸檔的表,選項“i”用於指定索引,預設情況下使用主鍵。選項“a”和“b”可用於調整語句透過二進位制日誌的流向。使用“b”選項會禁用指定連線上的二進位制日誌記錄。若選擇“a”選項,則連線將使用指定的資料庫,可透過此方式防止二進位制日誌事件在伺服器上執行時使用 --replicate-ignore-db 選項。這兩個選項提供了實現相同目標的不同方法,即將資料從主伺服器歸檔,同時在從伺服器上保留它。可以在主伺服器上執行清理作業,並透過所選方式防止其在從伺服器上執行。
--statistics 收集和列印時間統計資料
--stop 透過建立sentine檔案來停止歸檔
--txn-size 指定每次事務提交的行數。與commit-each互斥
--unstop 刪除sentine檔案
--user 登入的使用者
--version 顯示版本號
--[no]version-check 自動檢查更新功能,預設是檢查的
--where 指定 WHERE 子句限制歸檔哪些行。如果不需要 WHERE 條件,可使用 WHERE 1=1
--why-quit 列印退出原因

最佳實踐

建立一張archiver_test表,並生成1000條資料

greatsql> CREATE TABLE archiver_test (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255),
    age INT,
    gender VARCHAR(10),
    timestamp TIMESTAMP
);

greatsql> select count(*) from archiver_test;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.01 sec)

在使用過程中可能會需要依賴例如:Cannot connect to MySQL because the Perl DBD::mysql module is not installed or not found.此時按提示安裝相應依賴包即可

歸檔到同一例項上的不同表

注意!此操作會刪除源表的資料,若不刪除源表資料請加上使用--no-delete

$ pt-archiver --source h=localhost,P=3306,u=root,D=test_db,t=archiver_test --charset=utf8mb4  --ask-pass --dest h=localhost,P=3306,u=root,D=test_db,t=archiver_test2 --ask-pass --where "id<100" --limit 1000 --commit-each
# 會讓你輸入密碼(源端)
# 會讓你輸入密碼(目標端)

虛擬碼如下

pt-archiver --source h=源ip,P=源埠,u=使用者,p=密碼,D=庫名,t=表名 --ask-pass --dest h=目標IP,P=埠,u=使用者,p=密碼,D=庫名,t=表名 --ask-pass --where "id<100" --limit 1000 --commit-each

需要目標表已建立且欄位一致,否則報錯:"Table 'test_db.archiver_test2' doesn't exist "

欄位不一致報錯:”The following columns exist in --dest but not --source: name2“

檢查下是否已經歸檔成功

greatsql> select count(*) from archiver_test2;
+----------+
| count(*) |
+----------+
|       99 |
+----------+
1 row in set (0.00 sec)

因為--dest會從--source繼承相同的值,所以上面也可以改寫成以下方式

$ pt-archiver --source h=localhost,P=3306,u=root,D=test_db,t=archiver_test --charset=utf8mb4  --ask-pass --dest t=archiver_test2 --where "id<100" --limit 1000 --commit-each

也可用Socket來進行登入,如果使用單機多例項部署GreatSQL的時候採用這種方法要尤其注意選擇對應Socket

$ pt-archiver --source u=root,D=test_db,t=archiver_test -S /data/MySQL/GreatSQL.sock  --charset=utf8mb4 --dest t=archiver_test2  --where "id<100" --limit 1000 --commit-each

也可以透過 my.cnf 配置檔案讀取使用者名稱和密碼,但是在 my.cnf 檔案中需要配置好使用者名稱和密碼

$ vim /etc/my.cnf
[client]
user=your_user_name
pass=sectet

$ pt-archiver --source F=/etc/my.cnf,u=root,D=test_db,t=archiver_test --charset=utf8mb4 --dest t=archiver_test2  --where "id<100" --limit 1000 --commit-each

歸檔時不寫入Binlog

新增b=true指定歸檔操作不寫入Binlog中

$ pt-archiver --source b=true,h=localhost,P=3306,u=root,D=test_db,t=archiver_test --charset=utf8mb4  --ask-pass --dest b=true,t=archiver_test3  --where "id<100" --limit 1000 --commit-each

歸檔到檔案

匯出到外部檔案,且不刪除源端表的資料

$ pt-archiver --source h=localhost,D=test_db,t=archiver_test,u=root --where '1=1' --no-check-charset --no-delete --file="/data/bk/archiver_test.dat"

因檔案沒有utf8mb4編碼,所以設定了no-check-charset不檢查字符集

檢查備份情況

$ tail -n 3 /data/bk/archiver_test.dat
997     Fukuda Akina    449     F       2022-02-15 05:54:27
998     Sara Nguyen     45      F       2018-07-08 13:35:45
999     Chan Ka Man     644     M       2012-02-08 18:18:14

pt-find

概要

此工具可以查詢符合條件的表,並做一些相應的操作。預設操作是列印資料庫和表名稱

用法

  • pt-find [OPTIONS] [DATABASES]

選項

引數 含義
--ask-pass 連線 MySQL/GreatSQL 時提示輸入密碼
--case-insensitive 指定所有正規表示式搜尋不區分大小寫
--charset 預設字符集
--config 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項
--database 連線到該資料庫
--day-start 從今天開始而不是從當前時間開始測量時間
--defaults-file 只從給定檔案中讀取 MySQL/GreatSQL 選項
--help 顯示幫助
--host 連線到主機
--or 用 OR(而不是 AND)組合測試
--password 連線時使用的密碼
--pid 建立給定的 PID 檔案
--port 用於連線的埠號
--[no]quote 使用 MySQL/GreatSQL 的標準反引號字元引用 MySQL/GreatSQL 識別符號名稱
--set-vars 在這個以逗號分隔的 variable=value 對列表中設定 MySQL/GreatSQL 變數
--socket 用於連線的套接字檔案
--user 登入的使用者
--version 顯示版本
--[no]version-check 版本檢查

最佳實踐

查詢大於1G的表

$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --tablesize +1G
`tpch`.`customer`
`tpch`.`lineitem`
`tpch`.`orders`
`tpch`.`part`
`tpch`.`partsupp`

查詢修改過的表

# 30分鐘之內
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --mmin -30
`mysql`.`gtid_executed`
`test_db`.`archiver_test`

# 30分鐘之前
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --mmin +30
`aptest`.`sys_dept`
`aptest`.`sys_user`

此查詢基於INFORMATION_SCHEMA.TABLES表中的Update_time列,如果information_schema_stats_expiry設定的更新時間過長,將導致Update_time列不會實時更新。因此,在這種情況下,將無法準確地檢索在過去30分鐘內發生修改的表。

查詢無資料的表

$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --empty
`db2`.`t1`
`db2`.`t2`

查詢表並修改儲存引擎

# 查詢1天內建立的MyISAM表
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --ctime -1 --engine MyISAM
`test_db`.`myisam`

# 查詢1天內的MyISAM表並修改為InnoDB
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --ctime -1 --engine MyISAM --exec "ALTER TABLE %D.%N ENGINE=InnoDB"

# 驗證下是否修改成功,此時可以用到上述的pt-align工具使輸出更加美觀
$ mysql -e "SHOW TABLE STATUS FROM test_db" | pt-align | grep your_table_name
myisam InnoDB ......

# 查詢1天前的InnoDB表
$ pt-find --socket=/data/GreatSQL/mysql.sock --user=root --port=3306 --ctime +1 --engine InnoDB

InnoDBMyISAM兩個儲存引擎名字必須按照標準輸入,否則將無法進行正確的查詢

查詢空表並刪除

# 避免不必要的刪除錯誤,先查詢哪些是空表,在刪除
$ pt-find --socket=/data/GreatSQL/mysql.sock --empty test_db
`test_db`.`archiver_test3`

# 查詢test_db庫中空表並刪除
$ pt-find --socket=/data/GreatSQL/mysql.sock --empty test_db --exec-plus "DROP TABLE %s"

驗證是否刪除成功

greatsql> SHOW TABLES IN test_db LIKE 'archiver_test3';
Empty set (0.00 sec)

所有表資料和索引總大小排序

$ pt-find --socket=/data/GreatSQL/mysql.sock --printf "%T\t%D.%N\n" | sort -rn
7992197120      `tpch`.`orders`
7817084928      `tpch`.`lineitem`
......

# 輸出有些沒對齊,可以使用pt-align工具對齊
$ pt-find --socket=/data/GreatSQL/mysql.sock --printf "%T\t%D.%N\n" | sort -rn | pt-align
7992197120 `tpch`.`orders`                                                            
7817084928 `tpch`.`lineitem`
......

pt-fingerprint

將查詢轉成密文

概要

此工具可以將SQL語句重新格式化為另一種抽象形式,既所有具體值都以?代替。可以適用於資料脫敏的場景。

用法

  • pt-fingerprint [OPTIONS] [FILES]

選項

引數 含義
--config 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項
--help 顯示幫助並退出
--match-embedded-numbers 匹配單詞中嵌入的數字並替換為單個值
--match-md5-checksums 匹配 MD5 校驗和並替換為單個值
--query 要轉換為加密的查詢
--version 顯示版本並退出

最佳實踐

替換單個語句

$ pt-fingerprint --query "select a, b, c from users where id = 5 and greatsql = 666"
select a, b, c from users where id = ? and greatsql = ?

$ pt-fingerprint --query "INSERT INTO product(ID,NAME,PRICE) VALUES(1,'greatsql',666)"
insert into product(id,name,price) values(?+)

如果SQL語句中欄位名或表名有數字,也會被替換

$ pt-fingerprint --query "select a1, b2, c3 from users4 where id = 500 and greatsql = 8032"
select a?, ?, c? from users? where id = ? and greatsql = ?

若不想替換欄位名或表名可加上--match-embedded-numbers

$ pt-fingerprint --match-embedded-numbers --query "select a1, b2, c3 from users4 where id = 5 and greatsql = 666"
select a1, b2, c3 from users4 where id = ? and greatsql = ?

--match-md5-checksums引數使用也是同理,避免MD5值被替換

替換檔案中語句

建立檔案pt_fingerprint_test_sql.txt

$ vim pt_fingerprint_test_sql.txt
select a from users where greatsql = 666;
select b from users where greatsql = 777;
select c from users where 
greatsql = 888;

替換檔案中的所有SQL語句

$ pt-fingerprint pt_fingerprint_test_sql.txt
select a from users where greatsql = ?
select b from users where greatsql = ?
select c from users where greatsql = ?

不管檔案內格式如何,pt-fingerprint工具都會規範化空格等

當然也可以用作替換慢日誌(Slow.log)的SQL內容

pt-kill

Kill掉符合條件的SQL

概要

pt-kill可以Kill掉任何語句,特別出現大量的阻塞,死鎖,或某個有問題的SQL導致MySQL/GreatSQL負載很高的情況。會預設過濾掉複製執行緒。

用法

  • pt-kill [OPTIONS] [DSN]

選項

至少指定 --kill--kill-query--print--execute-command--stop 之一

部分引數選項存在互斥,不可同時存在,詳見:

選項A 選項B 關係
--any-busy-time --each-busy-time 互斥
--kill --kill-query 互斥
--daemonize --test-matching 互斥

所有引數選項如下:

選項 含義
--ask-pass 連線 MySQL/GreatSQL 時提示輸入密碼
--charset 預設字符集
--config 讀取這個逗號分隔的配置檔案列表,如果指定,這必須是命令列上的第一個選項
--create-log-table 如果--log-dsn表不存在,則建立
--daemonize 放在後臺以守護程序的形式執行
--database 用於連線的資料庫
--defaults-file 只從給定檔案中讀取 MySQL/GreatSQL 選項
--filter 丟棄此 Perl 程式碼不返回 true 的事件
--group-by 將匹配應用於由此 SHOW PROCESSLIST 列分組的每一類查詢
--help 顯示幫助並退出
--host 連線到主機
--interval 檢查要終止的查詢的頻率
--log 守護程序時將所有輸出列印到此檔案
--log-dsn 將終止的每個查詢儲存在此 DSN 中
--json 將終止的查詢列印為 JSON,必須與--print一起使用。
--json-fields 使用--json時指定要包含在 JSON 輸出中的附加鍵
--password 連線時使用的密碼
--pid 建立給定的 PID 檔案
--port 用於連線的埠號
--query-id 列印剛剛被終止的查詢的 ID
--rds 表示相關例項位於 Amazon RDS 上
--run-time 退出前要執行多長時間
--sentinel 如果該檔案存在則退出
--slave-user 設定用於連線從機的使用者
--slave-password 設定用於連線從機的密碼
--set-vars 在這個以逗號分隔的variable=value對列表中設定 MySQL/GreatSQL 變數
--socket 用於連線的套接字檔案
--stop 使 pt-kill 建立 --sentinel 指定的哨兵檔案並退出
--[no]strip-comments 從 PROCESSLIST 的 Info 列中的查詢中刪除 SQL 註釋
--user 登入的使用者
--version 顯示版本並退出
--[no]version-check 版本檢查
--victims 每個類中的哪些匹配查詢將被終止
--wait-after-kill 殺死一個查詢後等待,然後再尋找更多要殺死的查詢
--wait-before-kill 在終止查詢之前等待

最佳實踐

Kill查詢指定時間的連線

每十秒鐘記錄一下用時超過三十秒的查詢語句,並且將這些語句輸出到/data/pt_slow.log檔案中

$ pt-kill --user=root --ask-pass --match-info "select|SELECT" --match-command='Query' --busy-time 30 --victims all --interval 10 --daemonize --print --log=/data/pt_slow.log
  • --match-command:匹配當前連線的命令,對應 SHOW PROCESSLIST 捕獲的 Command 對應值(可選值:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump);

  • --match-info:正則匹配正則執行的 SQL,區分大小寫;

  • --interval:多久執行一次。預設單位秒。預設值30秒

也可以加上--kill直接Kill掉符合條件的查詢語句

$ pt-kill --user=root --ask-pass --match-info "select|SELECT" --match-command='Query' --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/data/pt_slow.log

--victims預設是oldest只Kill最先發起,存在時間最長的查詢。all Kill掉所有滿足的執行緒。all-but-oldest只保留最長的不Kill其它都Kill掉

Kill指定IP的會話

列印出指定IP的會話

$ pt-kill --user=root --ask-pass --match-db='test_db' --match-host "192.168.6.55" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/data/pt_ip.log

Kill指定IP的會話

$ pt-kill --user=root --ask-pass --match-db='test_db' --match-host "192.168.6.55" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/data/pt_ip.log

Kill指定使用者的會話

Kill指定使用者的會話

$ pt-kill --user=root --ask-pass --match-db='test_db' --match-user "greatsql" --victims all --interval 10 --daemonize --kill --log=/data/pt_user.log

Kill指定使用者大於10秒的空閒連結

$ pt-kill --user=root --ask-pass --match-db='db_name' --match-user "greatsql" --victims all --interval 10 --daemonize --kill --match-command='Sleep' --idle-time 10 --log=/data/pt_user.log

pt-kill工具會掛在後臺定時Kill符合條件的使用者、語句。

若需要停止請使用kill -9 $(ps -ef| grep pt-kill |grep -v grep |awk '{print $2}')

pt-secure-collect

概要

pt-secure-collect用於收集、清理、打包和加密資料

用法

  • pt-secure-collect [] [ ...]

預設情況下,pt-secure-collect 將收集以下輸出:

  • pt-stalk
  • pt-summary
  • pt-mysql-summary

採集命令

  • pt-secure-collect collect

解密命令

  • pt-secure-collect decrypt

加密命令

  • pt-secure-collect encrypt

清理命令

  • pt-secure-collect sanitize

選項

最佳實踐

收集GreatSQL資訊

以非加密方式收集GreatSQL資訊並且不刪除臨時檔案

$ pt-secure-collect collect --mysql-user=root --mysql-password="" --mysql-port=3306 --mysql-host=localhost --bin-dir=/usr/bin --temp-dir=/data/data_collection --no-encrypt --no-remove-temp-files

INFO[2024-03-11 17:05:02] Creating temporary directory: /data/data_collection 
INFO[2024-03-11 17:05:02] Temp directory is "/data/data_collection"    
INFO[2024-03-11 17:05:02] Creating output file "/data/data_collection/pt-stalk_2024-03-11_17_05_02.out" 
INFO[2024-03-11 17:05:02] Running pt-stalk --no-stalk --iterations=2 --sleep=30 --host=localhost --dest=/data/data_collection --port=3306 --user=root --password=******** 
INFO[2024-03-11 17:06:35] Creating output file "/data/data_collection/pt-summary_2024-03-11_17_06_35.out" 
INFO[2024-03-11 17:06:35] Running pt-summary                           
INFO[2024-03-11 17:06:36] Creating output file "/data/data_collection/pt-mysql-summary_2024-03-11_17_06_36.out" 
INFO[2024-03-11 17:06:36] Running pt-mysql-summary --host=localhost --port=3306 --user=root --password=******** 
INFO[2024-03-11 17:06:49] Sanitizing output collected data             
INFO[2024-03-11 17:06:57] Creating tar file "/data/data_collection/data_collection.tar.gz" 

--mysql-port--mysql-host雖有預設值但是還是需要指定,否則在呼叫執行其它工具時會報錯

可以從輸出上看到,pt-secure-collect工具呼叫了pt-stalkpt-summary pt-mysql-summary這三款工具

進入data_collection資料夾即可看到所有的臨時檔案,以及一個data_collection.tar.gz壓縮檔案

$ ls /data/data_collection
2024_03_11_17_05_03-df              2024_03_11_17_05_03-opentables2            2024_03_11_17_05_33-diskstats       2024_03_11_17_05_33-processlist
2024_03_11_17_05_03-disk-space      2024_03_11_17_05_03-output                 2024_03_11_17_05_33-dmesg           data_collection.tar.gz   .......其餘省略

加密檔案

pt-secure-collect encrypt /data/pt_secure_collect.txt --outfile=/data/pt_secure_collect.aes
Encryption password:  # 這裡輸入加密密碼
Re type password:     # 再次輸入加密密碼
INFO[2024-03-12 09:36:39] Encrypting file "/data/pt_secure_collect.txt" into "/data/pt_secure_collect.aes"  # 加密成功

加密成功後此時會生成一個字尾為aes的檔案,直接檢視會亂碼

$ ls
pt_secure_collect.aes pt_secure_collect.txt

$ cat pt_secure_collect.aes
5�66~x�y��+�    ?i`��pESϡ>()�g�,�e�u #亂碼

解密檔案

$ pt-secure-collect decrypt /data/pt_secure_collect.aes
Encryption password: # 輸入加密的密碼
INFO[2024-03-12 09:41:35] Decrypting file "/data/pt_secure_collect.aes" into "pt_secure_collect" 

$ cat pt_secure_collect
111
aaa
select * from test where id =2;

假設輸入錯誤密碼,不會提示密碼錯誤,而是輸出亂碼結果

$ pt-secure-collect decrypt /data/pt_secure_collect.aes
Encryption password:  # 這裡假設輸入錯誤密碼
INFO[2024-03-12 09:44:45] Decrypting file "/data/pt_secure_collect.aes" into "pt_secure_collect" 

$ cat pt_secure_collect
;       �}X����#z1�e��s�/��E���OeB�6��,��       �# 

加密檔案

這個功能和上面介紹的pt-fingerprint工具有點類似,都是使用?替換關鍵資訊

先造一個文字

$ cat pt_secure_collect.txt
select * from test where id =2;
ip = 192.168.6.66

使用sanitize功能,會隱去關鍵資訊和主機名

$ pt-secure-collect sanitize --input-file=/data/pt_secure_collect.txt --no-sanitize-queries
select * from test where id =?;
ip = hostname

如果不隱去主機可以使用--no-sanitize-hostnames

如果不隱去查詢可以使用--no-sanitize-queries

本文完 😃 下章節將介紹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

image-20230105161905827

技術交流群:

微信:掃碼新增GreatSQL社群助手微信好友,傳送驗證資訊加群

image-20221030163217640

相關文章