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
本文完 😃 下章節將介紹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社群助手
微信好友,傳送驗證資訊加群
。