Percona Toolkit簡稱pt工具—PT-Tools,是Percona公司開發用於管理MySQL的工具,功能包括檢查主從復制的數據一致性、檢查重復索引、定位IO占用高的表文件、在線DDL等
下載地址為: https://www.percona.com/downloads/percona-toolkit/LATEST/
安裝:
percona-toolkit-3.0.13_x86_64.tar.gz 下載
tar -xf percona-toolkit-3.0.13_x86_64.tar.gz 解壓
cd percona-toolkit-3.0.13/bin
cp * /usr/bin
[root@mycat bin]# pt-slave-restart --version
pt-slave-restart 3.0.13
[root@mycat ~]# pt
pt-align pt-config-diff pt-fingerprint pt-kill pt-online-schema-change pt-slave-delay pt-table-sync
ptar pt-deadlock-logger pt-fk-error-logger ptksh pt-pmp pt-slave-find pt-table-usage
pt-archiver pt-diskstats pt-heartbeat pt-mext pt-query-digest pt-slave-restart pt-upgrade
ptardiff pt-duplicate-key-checker pt-index-usage pt-mongodb-query-digest pt-secure-collect pt-stalk pt-variable-advisor
ptargrep pt-fifo-split pt-ioprofile pt-mongodb-summary pt-show-grants pt-summary pt-visual-explain
ptaskset pt-find ptked pt-mysql-summary pt-sift pt-table-checksum ptx
1.pt-archive ----MySQL的在線歸檔,無影響生產
2.pt-kill -----自定義查殺。確保慢查詢及惡性攻擊對生產無影響
3.pt-online-schema-change ----在線DDL操作,對上億的大表加索引加字段且對生產無影響
4.pt-query-digest -----慢查詢Log的分析。
5.pt-slave-delay ---就是指定從庫比主庫延遲多長時間
6.pt-table-checksum & pt-table-sync-----檢查主從是否一致性-----檢查主從不一致之后用這個工具進行處理 這兩個一搬是搭配使用
7. pt-find ---找出幾天之前建立的表
8. pt-slave-restart -----主從報錯,跳過報錯
9.pt-summary ---整個系統的的概述
10.pt-mysql-summary ---MySQL的表述,包括配置文件的描述
11.pt-duplicate-key-checker ---檢查數據庫重復索引
pt-archive解釋使用:##歸檔 用此操作的表必須有主鍵。
1.歸檔歷史數據;
2.在線刪除大批量數據;
3.數據導出和備份;
4.數據遠程歸檔;
5.數據清理
1.pt-archive –help 參數,用這可以help一下
幾個常用說明
--limit10000 每次取1000行數據用pt-archive處理
--txn-size 1000 設置1000行為一個事務提交一次,
--where‘id<3000‘ 設置操作條件
--progress5000 每處理5000行輸出一次處理信息
--statistics 輸出執行過程及最后的操作統計。(只要不加上--quiet,默認情況下pt- archive都會輸出執行過程的)
--charset=UTF8 指定字符集為UTF8—這個最后加上不然可能出現亂碼。
--bulk-delete 批量刪除source上的舊數據(例如每次1000行的批量刪除操作)
例:
(1).將表中CREATE_DATE字段小於2018-01-01 00:00:00時間的數據進行歸檔,不刪除原表記錄
pt-archiver --source h=192.168.X.X ,P=3306,u=用戶,p=密碼,D=庫名,t=表名 --dest h=目標IP,P=3306,u=用戶,p=密碼,D=庫名,t=表名 --no-check-charset --where CREATE_DATE<"2015-10-01 00:00:00"' --progress 5000 --no-delete --limit=10000 –statistics
注:字符要加上雙單 ---"2015-10-01"
(2).阿里雲RDS保留三個月數據
pt-archiver --source h=RDS地址,P=端口,u=用戶名,p=密碼,D=庫名,t=表名 --where nextfetch<REPLACE(UNIX_TIMESTAMP(SUBDATE(current_timestamp(3),INTERVAL 92 DAY)),".","") --purge --limit=5000 --no-check-charset --no-version-check --statistics --progress 10000 (定時執行腳本進行刪除操作)
注: 阿里雲RDS要加 --no-version-check參數
(3).遠程歸檔
(遠程歸檔) pt-archiver --charset ‘utf8’ --source h=127.0.0.1,P=6006,u=root,p=‘密碼’,D=源庫,t=源表 --dest h=10.59.1.152,P=6006,u=sys_dba,p=‘密碼’,D=目標庫,t=目標表 --where 'periodID=1' --progress 5000 --limit=5000 –statistics
pt-kill ##解釋說明 kill MySQL連接的一個工具 kill掉你想Kill的任何語句,特別出現大量的阻塞,死鎖,某個有問題的sql導致mysql負載很高黑客攻擊。當有很多語句時你不可能用show processlist去查看,當QPS很高時,你根本找不到你找的語句或ID,這時就可以用Pt-kill來完成;他可以根據運行時間,開源IP,用戶名,數據庫名。SQL語句,sleep,running 等狀態進行匹配然后kill
PT-kill 參數 --help
常用參數說明
--daemonize 放在后台以守護進程的形式運行;
--interval 多久運行一次,單位可以是s,m,h,d等默認是s –不加這個默認是5秒
--victims 默認是oldest,只殺最古老的查詢。這是防止被查殺是不是真的長時間運行的查詢,他們只是長期等待 這種種匹配按時間查詢,殺死一個時間最高值。
--all 殺掉所有滿足的線程
--kill-query 只殺掉連接執行的語句,但是線程不會被終止
--print 打印滿足條件的語句
--busy-time 批次查詢已運行的時間超過這個時間的線程;
--idle-time 殺掉sleep 空閑了多少時間的連接線程,必須在--match-command sleep時才有效—也就是匹配使用 -- –match-command 匹配相關的語句。
----ignore-command 忽略相關的匹配。 這兩個搭配使用一定是ignore-commandd在前 match-command在后,
--match-db cdelzone 匹配哪個庫
command有:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump
例:
---殺掉空閑鏈接sleep 5秒的 SQL 並把日志放到/home/pt-kill.log文件中
/usr/bin/pt-kill --user=用戶名 --password=密碼 --match-command Sleep --idle-time 5 --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &
---查詢SELECT 超過1分鍾路
/usr/bin/pt-kill --user=用戶名 --password=密碼 --busy-time 60 --match-info "SELECT|select" --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &
--- Kill掉 select IFNULl.*語句開頭的SQL
pt-kill --user=用戶名 --password=密碼 --victims all --busy-time=0 --match-info="select IFNULl.*" --interval 1 -S /tmp/mysqld.sock --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill123.log &
----kill掉state Locked
/usr/bin/pt-kill --user=用戶名 --password=密碼 --victims all --match-state='Locked' --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &
---kill掉 qz_business_servic 庫,web為110.59.2.37的鏈接
pt-kill --user=用戶名 --password=密碼 --victims all --match-db='qz_business_service' --match-host='10.59.2.37' --kill --daemonize --interval 10 -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &
---指定哪個用戶kill
pt-kill --user=用戶名 --password=密碼 --victims all --match-user='root' --kill --daemonize --interval 10 -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &
---查詢SELECT 超過1分鍾路
pt-kill --user=用戶名 --password=密碼 --busy-time 60 --match-info "SELECT|select" --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &
----kill掉 command query | Execute
pt-kill --user=用戶名 --password=密碼 --victims all --match-command= "query|Execute" --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &
注:上面都是說針對手動或緊急情況下處理的事
pt-online-schema-change ###簡稱 pt-osc 在線更改表結構 MySQL 大字段的DDL操作:加減字段、索引、修改字段屬性
注:被操作的表如果有 觸發器,或外鍵不可用
工作原理:
1.創建一個和要執行 alter 操作的表一樣的新的空表結構(是alter之前的結構)
2.在新表執行alter table 語句(速度應該很快)
3.在原表中創建觸發器3個觸發器分別對應insert,update,delete操作
4.以一定塊大小從原表拷貝數據到臨時表,拷貝過程中通過原表上的觸發器在原表進行的寫操作都會更新到新建的臨時表
5.Rename 原表到old表中,在把臨時表Rename為原表
pt-online-schema-change --help 參數
--max-load 默認為Threads_running=25。每個chunk拷貝完后,會檢查SHOW GLOBAL STATUS的內容,檢查指標是否超過了指定的閾值。如果超過,則先暫停。這里可以用逗號分隔,指定多個條件,每個條件格式: status指標=MAX_VALUE或者status指標:MAX_VALUE。如果不指定MAX_VALUE,那么工具會這只其為當前值的120%。
--critical-load 默認為Threads_running=50。用法基本與--max-load類似,如果不指定MAX_VALUE,那么工具會這只其為當前值的200%。如果超過指定值,則工具直接退出,而不是暫停
--user: -u,連接的用戶名
--password: -p,連接的密碼
--database: -D,連接的數據庫
--port -P,連接數據庫的端口
--host: -h,連接的主機地址
--socket: -S,連接的套接字文件
--statistics 打印出內部事件的數目,可以看到復制數據插入的數目。
--dry-run 創建和修改新表,但不會創建觸發器、復制數據、和替換原表。並不真正執行,可以看到生成的執行語句,了解其執行步驟與細節。
--dry-run與--execute必須指定一個,二者相互排斥。和--print配合最佳。
--execute 確定修改表,則指定該參數。真正執行。
--dry-run與--execute必須指定一個,二者相互排斥。
--print 打印SQL語句到標准輸出。指定此選項可以讓你看到該工具所執行的語句,和--dry-run配合最佳。
--progress 復制數據的時候打印進度報告,二部分組成:第一部分是百分比,第二部分是時間。
--quiet -q,不把信息標准輸出。
例:
(1).對t=learn_tracedb 對learn_tracedb 表的updateTime 列添加索引
pt-online-schema-change --user=root --password=‘密碼' --port=6006 --host=127.0.0.1 --critical-load Threads_running=100 --alter "ADD INDEX index_updateTime (updateTime)" D=acc_tasktrace,t=learn_tracedb --print --execute
(2).對cware_user_point 添加periodid列
pt-online-schema-change --user=root --password=‘密碼' --port=6006 --host=127.0.0.1 --critical-load Threads_running=200 --alter "ADD COLUMN periodID int(11)" D=acc_cwaretiming,t=cware_user_point --print –execute
pt-query-digest ###-----慢查詢Log的分析
pt-query-digest --help參數
--create-review-table 當使用--review參數把分析結果輸出到表中時,如果沒有表就自動創建。
--create-history-table 當使用--history參數把分析結果輸出到表中時,如果沒有表就自動創建。
--filter 對輸入的慢查詢按指定的字符串進行匹配過濾后再進行分析
--limit限制輸出結果百分比或數量,默認值是20,即將最慢的20條語句輸出,如果是50%則按總響應時間占比從大到小排序,輸出到總和達到50%位置截止。
--host mysql服務器地址
--host mysql服務器地址
--user mysql用戶名
--password mysql用戶密碼
--history 將分析結果保存到表中,分析結果比較詳細,下次再使用--history時,如果存在相同的語句,且查詢所在的時間區間和歷史表中的不同,則會記錄到數據表中,可以通過查詢同一CHECKSUM來比較某類型查詢的歷史變化。
--review 將分析結果保存到表中,這個分析只是對查詢條件進行參數化,一個類型的查詢一條記錄,比較簡單。當下次使用--review時,如果存在相同的語句分析,就不會記錄到數據表中。
--output 分析結果輸出類型,值可以是report(標准分析報告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便於閱讀。
--since 從什么時間開始分析,值為字符串,可以是指定的某個”yyyy-mm-dd [hh:mm:ss]”格式的時間點,也可以是簡單的一個時間值:s(秒)、h(小時)、m(分鍾)、d(天),如12h就表示從12小時前開始統計。
--until 截止時間,配合—since可以分析一段時間內的慢查詢。
例:
(1).分析指定時間段的慢查詢
pt-query-digest /home/zb/data/my6006/log/mysql_slow_2018-11-07.log --since ‘2018-11-07 00:00:00’ --until ‘2018-11-11 15:50:00’
Overall: 總共有多少條查詢,上例為總共2.7k個查詢。
Time range: 查詢執行的時間范圍。
unique: 唯一查詢數量,即對查詢條件進行參數化以后,總共有多少個不同的查詢,該例為64。
total: 總計
min:最小
max: 最大
avg:平均 95%: 把所有值從小到大排列,位置位於95%的那個數,這個數一般最具有參考價值。
median: 中位數,把所有值從小到大排列,位置位於中間那個數。
針對某個用戶的慢查詢
(2).pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' /web/mysql/data/chinapen40-slow.log > slow_report5.log
pt-slave-delay ###---就是指定從庫比主庫延遲多長時間—---從庫上執行
工作原理: 通過啟動和停止從服務器的sql線程來設置從落后於主。它是通過slave的relay log(中繼日志)的position(偏移量),不斷啟動,關閉replication SQL thread來保持主從一直延時固定長的時間來實現。因此不需要連接到主服務器。如果IO進程不落后主服務器太多的話,這個檢查方式還是有效的,如果IO線程延時過大,pt-slave-delay也可以連接到主庫來獲取binlog的位置信息。
pt-slave-delay --delay=1m --interval=15s --run-time=10m u=root,p=123456,h=127.0.0.1,P=6006 --從服務器上執行
參數解釋:
--delay :從庫延遲主庫的時間,上面為1分鍾。
--interval :檢查的間隔時間,上面為15s檢查一次。(可選),不選則1分鍾檢查一次(默認)。
--run-time :該命令運行時間,上面為該命令運行10分鍾關閉。(可選),不選則永遠運行。--一搬不加此參數
pt-table-checksum & pt-table-sync ###-----檢查主從是否一致性-----檢查主從不一致之后用這個工具進行處理 這兩個一搬是搭配使用(一搬主從不一樣肯定要查一下,不能直接修復就完事了。這個大家可用於輔助工具。)
參數講解:
replicate=test.checksum:主從不一致的結果放到哪一張表中,一般我放在一個既有的數據庫中,這個checksum表由pt-table-checksum工具自行建立。
databases=testdb :我們要檢測的數據庫有哪些,這里是testdb數據庫,如果想檢測所有數據庫那么就不要寫這個參數了,如果有多個數據庫,我們用逗號連接就可以了。 host='127.0.0.1' :主庫的IP地址或者主機名。
user=dba :主機用戶名。 ---確定此用戶可以訪問主從數據庫
port=6006:主庫端口號。
recursion-method=hosts :主庫探測從庫的方式。
empty-replicate-table:清理上一次的檢測結果后開始新的檢測。
no-check-bin-log-format:不檢查二進制日志格式,鑒於目前大多數生產數據庫都將二進制日志設置為“ROW”格式,而我們的pt-table-checksum會話會自行設定使用“STATEMENT”格式,所以這個選項請務必加上。
例:
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --recursion-method=hosts --databases=log_manage h=localhost,u=sys_dba,p='密碼',P=6006
結果參數:
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的信息。
ROWS :表的行數。
CHUNKS :被划分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名
檢測有差異之后到從庫上執行一下修復
注:用這個前提是此表必須要有主鍵或唯一索引
pt-table-sync --sync-to-master --replicate=test.checksums h=127.0.0.1,u=dba,P=6006,p=‘密碼’ --print ---------只打印不執行—看詳細
pt-table-sync --sync-to-master --replicate=test.checksums h=127.0.0.1,u=dba,P=6006,p=‘密碼’ --execute ----開始執行就修復了,再看一下就OK了 再檢測就沒有了
pt-slave-restart ###-----主從報錯,跳過報錯(基本不用)
--always :永不停止slave線程,手工停止也不行
--ask-pass :替換-p命令,防止密碼輸入被身后的開發窺屏
--error-numbers:指定跳過哪些錯誤,可用,進行分隔
--error-text:根據錯誤信息進行匹配跳過
--log:輸出到文件
--recurse:在主端執行,監控從端
--runtime:工具執行多長時間后退出:默認秒, m=minute,h=hours,d=days
--slave-user --slave-password :從庫的賬號密碼,從主端運行時使用
--skip-count:一次跳過錯誤的個數,膽大的可以設置大些,不指定默認1個
--master-uuid :級聯復制的時候,指定跳過上級或者上上級事務的錯誤
--until-master :到達指定的master_log_pos,file位置后停止, 格式:”file:pos“
--until-relay :和上面一樣,但是時根據relay_log的位置來停止
例:
自動跳過主從同步1032的報錯 建議大家在從庫上如下這個就可以了,多個以逗號隔開就可以了
/usr/bin/pt-slave-restart --user=root --password=‘密碼' --port=6006 --host=127.0.0.1 --error-numbers=1032
Pt-summary ###打印出來的信息包括:CPU、內存、硬盤、網卡等信息,還包括文件系統、磁盤調度和隊列大小、LVM、RAID、網絡鏈接信息、netstat 的統計,以及前10的負載占用信息和vmstat信息
使用:Pt-summary 就可以