1. 程式人生 > 實用技巧 >Percona-toolkit工具詳解

Percona-toolkit工具詳解

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 ---檢查資料庫重複索引