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

来源:https://www.cnblogs.com/greatsql/p/18219584
-Advertisement-
Play Games

Percona Toolkit 神器全攻略(實用類) Percona Toolkit 神器全攻略系列共八篇,前文回顧: 前文回顧 Percona Toolkit 神器全攻略 全文約定:$為命令提示符、greatsql>為GreatSQL資料庫提示符。在後續閱讀中,依據此約定進行理解與操作 實用類 在 ...


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

本文完

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • !!!是的沒錯,胖友們,保姆教程系列又更新了!!! @目錄前言簡介一、磁碟分區二、文件系統三、實際操作1. 使用lsblk命令查看新加入的磁碟信息2. 使用fdisk或者cfdisk分區新磁碟,並將分區標記為Linux文件系統類型(83)3. 格式化新分區,使用mkfs命令4. 創建掛載目錄,使用m ...
  • 1. 為什麼要有線程 我們知道一個集成應用場景需要多個進程同時調度執行各自的功能,那麼多進程的本質就是產生多個執行流,每個執行流執行不同的代碼和功能,但是一個進程由PCB(task_struct)、進程地址空間、頁表、文件描述符表等資源組成,是一個資源集合,創建的開銷較大,那麼為了滿足用戶的多執行流 ...
  • 目錄題目解析代碼展示process_A.cprocess_B.cprocess_C.c結果展示重要知識點記錄 題目 設計一個程式,作為進程A,進程A專門創建一個信號量集,要求信號量集中有1個信號量,對信號量集合中的信號量進行設置,要求集合中的信號量的初值為1,然後再設計2個程式,分別是進程B和進程C ...
  • 序言Linux基本知識回顧 Linux內核安全管理機制 根文件系統rootfs Linux根目錄下文件結構 Linux文件類型標準IO 標準IO操作數據流分析 文件 打開、關閉 fopen( ) fclose( ) 文件 字元讀寫 fgetc( ) fputc( ) 文件 行讀寫 fgets( ) ...
  • 前言 exFAT是微軟2006年推出的一種文件系統,距今已快二十年,相比於FAT16和FAT32,exFAT還是算年輕。exFAT一直是微軟的一個專用文件系統,直到2019年微軟發佈它的規範,目前微軟擁有exFAT多個元素的專利,如果產品上使用exFAT,需要微軟授權,否則有可能侵權。 exFAT被 ...
  • 【標題】ODBC驅動類問題定位方法 【需求分類】故障分析 【關鍵字】ODBC 【需求描述】由於我們的ODBC介面目前尚不完善,經常會遇見ODBC介面能力不足導致應用功能無法運行的問題,需要定位手段確定底層是哪個介面報錯 【需求原因分析】方便一線資料庫管理員初步分析故障 【分析方法】 ● 由於我們的O ...
  • 管理維護Oracle資料庫的時候,有時候會碰到用戶(應用程式)遠程連接/訪問資料庫非常慢,甚至連接超時的問題。這裡簡單總結一下遇到這類問題的方法,僅供參考,如有疏漏或不足之處,敬請指正。文中部分內容來自官方文檔Doc ID 1679567.1[1] 遇到這類問題,首先應該檢查/排除網路問題,一般來說 ...
  • 【標題】kettle從DM8的number類型同步到YashanDB的varchar類型,存入是科學計數法形式的數據 【問題分類】數據導入導出 【關鍵字】數據同步,number類型,科學計數法 【問題描述】客戶查詢不到準確數據,只看到科學計數法展示的字元串。number類型存入到Oracle(MyS ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...