Percona Toolkit 神器全攻略(實用類) Percona Toolkit 神器全攻略系列共八篇,前文回顧: 前文回顧 Percona Toolkit 神器全攻略 全文約定:$為命令提示符、greatsql>為GreatSQL資料庫提示符。在後續閱讀中,依據此約定進行理解與操作 實用類 在 ...
Percona Toolkit 神器全攻略(實用類)
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
InnoDB
和MyISAM
兩個存儲引擎名字必須按照標準輸入,否則將無法進行正確的查找
查找空表並刪除
# 避免不必要的刪除錯誤,先查找哪些是空表,在刪除
$ 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-stalk
、pt-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
本文完