PT-Kill:讓您的 MySQL 數據庫性能飆升!

概述

生產環境數據庫出現運行時間過長的 SQL,會影響數據庫性能,如果同時出現多個類似 SQL,則會影響數據庫的可用性,從而導致業務不可用或體驗差的情況。DBA 人工干預需要一定的時間,因此需要藉助工具進行監控並自動 kill 超預期執行的 SQL。PT-Kill 能夠實時監控 MySQL 數據庫的運行情況,準確捕獲慢查詢、死鎖等問題,幫助您及時發現並解決數據庫性能問題。

PT-Kill 的使用場景

  1. 慢查詢優化

當您的數據庫出現慢查詢時,PT-Kill 可以幫助您快速定位問題,找出導致慢查詢的原因(如索引不當、查詢語句複雜度高等),並給出針對性的優化建議。

  1. 高併發處理

在高併發場景下,PT-Kill 可以通過智能調整參數,有效提高數據庫吞吐量,確保數據庫在高負載情況下依然穩定運行。

  1. 鎖等待分析

PT-Kill 可以分析 MySQL 數據庫中的鎖等待情況,幫助您發現並解決死鎖、長時間鎖等待等問題,保證數據庫的順暢運行。

  1. 連接管理

通過 PT-Kill,您可以輕鬆管理 MySQL 數據庫的連接,如查看當前連接數、分析連接泄露等問題,確保數據庫連接資源得到合理利用。

PT-Kill 的優勢

  1. 跨平臺支持

PT-Kill 支持多種操作系統,包括 Linux、Windows、macOS 等,讓您可以在不同平臺上輕鬆使用。

  1. 易於安裝和使用

PT-Kill 提供了簡單易懂的安裝和使用說明,讓您可以快速上手,輕鬆解決數據庫性能問題。

  1. 持續更新和完善

PT-Kill 由 Percona 公司持續更新和完善,您可以放心使用,期待更多強大功能。

安裝部署

https://www.percona.com/downloads/percona-toolkit/LATEST/

 yum install percona-toolkit-3.5.2-2.el7.x86_64.rpm -y

參數說明

1. 線程或者會話的重要參數

舉幾個匹配例子如下:
(1) 按照命令 command 查殺線程
--match-command 多個 command 之間用 | 分隔,否則會失效。
command 類型:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump

(2) 按 state 來殺掉線程
state 類型有:Locked、login、copy to tmp table、Copying to tmp table、Copying to tmp table on disk、Creating tmp table、executing、Reading from net、Sending data、Sorting for order、Sorting result、Table lock、Updating
注意 state 的內容一定要嚴格匹配大小寫,否則會殺不掉。注意 --match-state 多個 state 之間用 | 分隔,否則會失效。

(3) 按 info 關鍵字來查殺線程
通過按 info 來殺掉線程,注意 info 的內容一定要嚴格匹配大小寫,否則會殺不掉。注意 --match-info 多個 info 之間用 | 分隔,否則會失效。
--ignore-info 不匹配
--match-info 匹配
info 可以使用 select、update、insert、delete 來進行匹配,並可使用 "|" 進行多項匹配,如 "select|SELECT|delete|DELETE|update|UPDATE"

(4) 按照訪問來源 host/ip 查殺線程
--ignore-host/--match-host
(5) 按照 DB 來查殺線程
--ignore-db/--match-db
(6) 按照數據庫用戶

--ignore-user/--match-user

2. 行爲參數

Action:
--kill 殺掉連接並且退出
--kill-query 只殺掉連接執行的語句,但是線程不會被終止
--print 打印滿足條件的語句

3. 其它重要參數

--interval 運行檢查 query 的間隔,
--victim 有三種情況:
oldest (默認值), 只殺最老的查詢 (最先發起的最長時間) 。這是防止被查殺是不是真的長時間運行的查詢,他們只是長期等待 。這種種匹配按時間查詢,殺死一個時間最高值 。
all 殺掉所有滿足的線程
all-but-oldest 殺死所有,但最長的保留不殺
--busy-time 批次查詢已運行的時間超過這個時間的線程;
--idle-time 殺掉 sleep 了多少時間的連接線程,必須在 --match-command sleep 時纔有效

使用示例

1. 查殺 select 大於 30s 的會話

只打印 - 查殺 select 大於 30s 的會話

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-info "select|SELECT" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log

執行殺操作 - 查殺 select 大於 30s 的會話

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-info "select|SELECT" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log

2. 查殺某 IP 來源的會話

只打印 - 查殺某 IP 來源的會話

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-host "192.168.65.129" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log

執行殺操作 - 查殺某 IP 來源的會話

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-host "192.168.65.129" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log

3. 查殺指定用戶的會話

打印 - 查殺指定用戶的會話

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-user "u2" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log

行殺操作 - 查殺指定用戶的會話

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-user "u2" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log

4. 殺掉正在進行指定操作的 sql

只打印 - 殺掉正在進行 filesort 的 sql

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-command Query --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log

執行殺操作 - 殺掉正在進行 filesort 的 sql

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-command Query --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log

只打印 Creating sort index

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-command Query --match-state "Creating sort index" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log

執行殺操作 Creating sort index

pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-command Query --match-state "Creating sort index" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log

小結

PT-Kill 是一款強大且實用的 MySQL 性能優化工具,無論您是數據庫新手還是專家,都能輕鬆上手並從中受益。通過實時監控、自動優化、查詢分析等多種功能,PT-Kill 可以幫助您快速解決各種數據庫性能問題,讓您的 MySQL 數據庫性能得到極大提升。

來源:https://www.toutiao.com/article/7238099749755175457/?log_from=064df26042a15_1685408598582

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ird4bQuRNgXFCHA0lN-tqw