Percona-toolkit工具詳解
阿新 • • 發佈:2020-11-24
Percona-toolkit工具詳解
一、安裝
[root@master ~]# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
[root@master ~]# percona-release enable tools release
[root@master ~]# yum install percona-toolkit -y
二、常用工具使用介紹
2.1、pt-archiver
作用:歸檔資料
# 重要引數 --limit 100 每次取100行資料用pt-archive處理 --txn-size 100 設定100行為一個事務提交一次, --where 'id<3000' 設定操作條件 --progress 5000 每處理5000行輸出一次處理資訊 --statistics 輸出執行過程及最後的操作統計。(只要不加上--quiet,預設情況下pt- archive都會輸出執行過程的) --charset=UTF8 指定字符集為UTF8—這個最後加上不然可能出現亂碼。 --bulk-delete 批量刪除source上的舊資料(例如每次1000行的批量刪除操作) 使用案例: 1.歸檔到資料庫 #首先得先建立一個表,建立一個和原表結構一樣的表 create tables test like city; [root@master ~]# pt-archiver --source h=192.168.1.111,D=world,t=city,u=root,p=123 --dest h=192.168.1.111,D=world,t=test,u=root,p=123 --where 'id<1000' --no-check-charset --no-delete --limit=100 --commit-each --progress 200 --statistics #其他引數: h #主機IP D #庫名 t #表名 u #使用者名稱 p #密碼 --dest #跟的是要歸檔到的庫名、表名、主機名等
2.只清理資料,清理剛剛歸檔的資料 pt-archiver --source h=192.168.1.111,D=world,t=test,u=root,p=123 --where 'id<100' --purge --limit=1 --no-check-charset 3.只把資料匯出到外部檔案,但是不刪除源表裡的資料 引數說明: --where #全部資料 --file #檔名稱 [root@master ~]# pt-archiver --source h=192.168.1.111,D=world,t=test,u=root,p=123 --where '1=1' --no-check-charset --no-delete --file="/tmp/archiver.dat"
2.2、pt-osc
作用:修改表結構、索引建立刪除
#場景: 修改表結構、索引建立刪除 不能加快速度,但是可以減少業務影響 pt-osc工作流程: 1、檢查更改表是否有主鍵或唯一索引,是否有觸發器 2、檢查修改表的表結構,建立一個臨時表,在新表上執行ALTER TABLE語句 3、在源表上建立三個觸發器分別對於INSERT UPDATE DELETE操作 4、從源表拷貝資料到臨時表,在拷貝過程中,對源表的更新操作會寫入到新建表中 5、將臨時表和源表rename(需要元資料修改鎖,需要短時間鎖表) 6、刪除源表和觸發器,完成表結構的修改。 ##=====================================================## pt-osc工具限制 1、源表必須有主鍵或唯一索引,如果沒有工具將停止工作 2、如果線上的複製環境過濾器操作過於複雜,工具將無法工作 3、如果開啟複製延遲檢查,但主從延遲時,工具將暫停資料拷貝工作 4、如果開啟主伺服器負載檢查,但主伺服器負載較高時,工具將暫停操作 5、當表使用外來鍵時,如果未使用--alter-foreign-keys-method引數,工具將無法執行 6、只支援Innodb儲存引擎表,且要求伺服器上有該表1倍以上的空閒空間。 pt-osc之alter語句限制 1、不需要包含alter table關鍵字,可以包含多個修改操作,使用逗號分開,如"drop clolumn c1, add column c2 int" 2、不支援rename語句來對錶進行重新命名操作 3、不支援對索引進行重新命名操作 4、如果刪除外來鍵,需要對外來鍵名加下劃線,如刪除外來鍵fk_uid, 修改語句為"DROP FOREIGN KEY _fk_uid" pt-osc之命令模板 ## --execute表示執行 ## --dry-run表示只進行模擬測試 ## 表名只能使用引數t來設定,沒有長引數 pt-online-schema-change \ --host="127.0.0.1" \ --port=3358 \ --user="root" \ --password="root@root" \ --charset="utf8" \ --max-lag=10 \ --check-salve-lag='xxx.xxx.xxx.xxx' \ --recursion-method="hosts" \ --check-interval=2 \ --database="testdb1" \ t="tb001" \ --alter="add column c4 int" \ --execute 例子:對test庫下的t1表,新增一個列age,default表示預設值,--print --execute列印執行結果,"引號裡面的是增加列,或者刪除列的sql語句" [root@master ~]# pt-online-schema-change --user=root --password=123 --host=192.168.1.111 --alter "add column age int default 0" D=test,t=t1 --print --execute
2.3、pt-table-checksum
作用:校驗主從資料的一致性
# 建立資料庫,存在校驗資訊的庫(主庫建立pt【名字任意】)
Create database pt CHARACTER SET utf8;
建立使用者checksum並授權
GRANT ALL ON *.* TO 'checksum'@'192.168.1.%' IDENTIFIED BY 'checksum';
flush privileges;
--[no]check-replication-filters # 是否檢查複製的過濾器,預設是yes,建議啟用不檢查模式。
--databases | -d # 指定需要被檢查的資料庫,多個庫之間可以用逗號分隔。
--[no]check-binlog-format: # 是否檢查binlog檔案的格式,預設值yes。建議開啟不檢查。因為在預設的row格式下會出錯。
--replicate: # 把checksum的資訊寫入到指定表中。pt.checksums表示pt庫的checksums表,--create-replicate-table會自動建立,差異的資料就存在這個表
--replicate-check-only: # 只顯示不同步資訊
--databases=test # 指定庫名
--tables=t1、t2 #指定表名,不指定庫名,則預設所有表
[root@master ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=pt.checksums --create-replicate-table --databases=test --tables=t1 h=192.168.1.111,u=checksum,p=checksum,P=3306
#!/bin/bash
date >> /root/db/checksum.log
pt-table-checksum --nocheck-binlog-format --nocheck-plan
--nocheck-replication-filters --replicate=pt.checksums --set-vars
innodb_lock_wait_timeout=120 --databases UAR_STATISTIC -u'checksum' -p'checksum'
-h'192.168.1.111' >> /root/db/checksum.log
date >> /root/db/checksum.log
2.4、pt-table-sync
作用:修復主從一致性
主要引數介紹
--replicate :指定通過pt-table-checksum得到的表.
--databases : 指定執行同步的資料庫。
--tables :指定執行同步的表,多個用逗號隔開。
--sync-to-master :指定一個DSN,即從的IP,他會通過show processlist或show slave status 去自動的找主。
h= :伺服器地址,命令裡有2個ip,第一次出現的是Master的地址,第2次是Slave的地址。
u= :帳號。
p= :密碼。
--print :列印,但不執行命令。
--execute :執行命令。
# 檢視解決方法
[root@master ~]# pt-table-sync --replicate=pt.checksums --databases=test --tables=t1 h=192.168.1.111,u=root,p=123,P=3306 h=192.168.1.112,u=root,p=123,P=3306 --print
# 執行解決方法
[root@master ~]# pt-table-sync --replicate=pt.checksums --databases=test --tables=t1 h=192.168.1.111,u=root,p=123,P=3306 h=192.168.1.112,u=root,p=123,P=3306 --execute
2.5、主鍵衝突檢查
作用:檢查重複索引
[root@master ~]# pt-duplicate-key-checker --database=world h='127.0.0.1' --user=root --password=123
# 然後會打印出重複的索引和刪除的sql語句,複製到資料庫執行就行了!
2.7、pt-kill 語句
作用:幹掉無法正常關閉的連線
常用引數說明
--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 /tmp/mysql.sock --pid=/tmp/ptkill.pid --print --log=/tmp/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 -S /tmp/mysql.sock --pid=/tmp/ptkill.pid --print --log=/tmp/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=/tmp/pt-kill.log &
----kill掉state Locked
/usr/bin/pt-kill --user=使用者名稱 --password=密碼 --victims all --match-state='Locked' --victim all --interval 5 --kill --daemonize -S /tmp/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/tmp/pt-kill.log &
---kill掉 a庫,web為10.0.0.11的連結
pt-kill --user=使用者名稱 --password=密碼 --victims all --match-db='a' --match-host='10.0.0.11' --kill --daemonize --interval 10 -S /tmp/mysqld.sock --pid=/tmp/ptkill.pid --print-log=/tmp/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 /tmp/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/tmp/pt-kill.log &
----kill掉 command query | Execute
pt-kill --user=使用者名稱 --password=密碼 --victims all --match-command= "query|Execute" --interval 5 --kill --daemonize -S /tmp/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &
2.8、mysql死鎖監測
pt-deadlock-logger h='127.0.0.1' --user=root --password=123456
2.9、其他
pt-find ---找出幾天之前建立的表
pt-slave-restart -----主從報錯,跳過報錯
pt-summary ---整個系統的的概述
pt-mysql-summary ---MySQL的表述,包括配置檔案的描述
pt-duplicate-key-checker ---檢查資料庫重複索引