1. pt工具安裝
[root@master ~]# yum install -y percona-toolkit-3.1.0-2.el7.x86_64.rpm
2. 常用工具使用介紹
2.1 pt-archiver 歸檔表
# 重要參數(shù)
--limit 100 每次取100行數(shù)據(jù)用pt-archive處理
--txn-size 100 設(shè)置100行為一個(gè)事務(wù)提交一次郊霎,
--where 'id<3000' 設(shè)置操作條件
--progress 5000 每處理5000行輸出一次處理信息
--statistics 輸出執(zhí)行過程及最后的操作統(tǒng)計(jì)诞仓。(只要不加上--quiet骂际,默認(rèn)情況下pt- archive都會(huì)輸出執(zhí)行過程的)
--charset=UTF8 指定字符集為UTF8—這個(gè)最后加上不然可能出現(xiàn)亂碼界牡。
--bulk-delete 批量刪除source上的舊數(shù)據(jù)(例如每次1000行的批量刪除操作)
使用案例:
1.歸檔到數(shù)據(jù)庫
pt-archiver --source h=10.0.0.11,D=world,t=city,u=root,p=123 --dest h=10.0.0.11,D=world,t=city2,u=root,p=123 --where 'id<1000' --no-check-charset --no-delete --limit=100 --commit-each --progress 200 --statistics
2.只清理數(shù)據(jù)
pt-archiver --source h=127.0.0.1,D=world,t=city2,u=root,p=123 --where 'id<100' --purge --limit=1 --no-check-charset
3.只把數(shù)據(jù)導(dǎo)出到外部文件,但是不刪除源表里的數(shù)據(jù)
pt-archiver --source h=10.0.0.11,D=world,t=city,u=root,p=123 --where '1=1' --no-check-charset --no-delete --file="/tmp/archiver.dat"
2.2 pt-osc
pt-osc工作流程:
1钦椭、檢查更改表是否有主鍵或唯一索引拧额,是否有觸發(fā)器
2、檢查修改表的表結(jié)構(gòu)彪腔,創(chuàng)建一個(gè)臨時(shí)表侥锦,在新表上執(zhí)行ALTER TABLE語句
3、在源表上創(chuàng)建三個(gè)觸發(fā)器分別對(duì)于INSERT UPDATE DELETE操作
4德挣、從源表拷貝數(shù)據(jù)到臨時(shí)表恭垦,在拷貝過程中,對(duì)源表的更新操作會(huì)寫入到新建表中
5格嗅、將臨時(shí)表和源表rename(需要元數(shù)據(jù)修改鎖署照,需要短時(shí)間鎖表)
6、刪除源表和觸發(fā)器吗浩,完成表結(jié)構(gòu)的修改。
##=====================================================##
pt-osc工具限制
1没隘、源表必須有主鍵或唯一索引懂扼,如果沒有工具將停止工作
2、如果線上的復(fù)制環(huán)境過濾器操作過于復(fù)雜右蒲,工具將無法工作
3阀湿、如果開啟復(fù)制延遲檢查,但主從延遲時(shí)瑰妄,工具將暫停數(shù)據(jù)拷貝工作
4陷嘴、如果開啟主服務(wù)器負(fù)載檢查,但主服務(wù)器負(fù)載較高時(shí)间坐,工具將暫停操作
5灾挨、當(dāng)表使用外鍵時(shí)邑退,如果未使用--alter-foreign-keys-method參數(shù),工具將無法執(zhí)行
6劳澄、只支持Innodb存儲(chǔ)引擎表地技,且要求服務(wù)器上有該表1倍以上的空閑空間。
pt-osc之a(chǎn)lter語句限制
1秒拔、不需要包含alter table關(guān)鍵字莫矗,可以包含多個(gè)修改操作,使用逗號(hào)分開砂缩,如"drop clolumn c1, add column c2 int"
2作谚、不支持rename語句來對(duì)表進(jìn)行重命名操作
3、不支持對(duì)索引進(jìn)行重命名操作
4庵芭、如果刪除外鍵妹懒,需要對(duì)外鍵名加下劃線,如刪除外鍵fk_uid, 修改語句為"DROP FOREIGN KEY _fk_uid"
pt-osc之命令模板
## --execute表示執(zhí)行
## --dry-run表示只進(jìn)行模擬測(cè)試
## 表名只能使用參數(shù)t來設(shè)置喳挑,沒有長參數(shù)
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
例子:
pt-online-schema-change --user=root --password=123 --host=10.0.0.11 --alter "add column age int default 0" D=test,t=t1 --print --execute
2.3 pt-table-checksum
創(chuàng)建數(shù)據(jù)庫
Create database pt CHARACTER SET utf8;
創(chuàng)建用戶checksum并授權(quán)
GRANT ALL ON *.* TO 'checksum'@'10.0.0.%' IDENTIFIED BY 'checksum';
flush privileges;
--[no]check-replication-filters:是否檢查復(fù)制的過濾器彬伦,默認(rèn)是yes,建議啟用不檢查模式伊诵。
--databases | -d:指定需要被檢查的數(shù)據(jù)庫单绑,多個(gè)庫之間可以用逗號(hào)分隔。
--[no]check-binlog-format:是否檢查binlog文件的格式曹宴,默認(rèn)值yes搂橙。建議開啟不檢查。因?yàn)樵谀J(rèn)的row格式下會(huì)出錯(cuò)笛坦。
--replicate`:把checksum的信息寫入到指定表中区转。
--replicate-check-only:只顯示不同步信息
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=pt.checksums --create-replicate-table --databases=test --tables=t1 h=10.0.0.11,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'10.0.0.11' >> /root/db/checksum.log
date >> /root/db/checksum.log
2.4 pt-table-sync
主要參數(shù)介紹
--replicate :指定通過pt-table-checksum得到的表.
--databases : 指定執(zhí)行同步的數(shù)據(jù)庫。
--tables :指定執(zhí)行同步的表版扩,多個(gè)用逗號(hào)隔開废离。
--sync-to-master :指定一個(gè)DSN,即從的IP礁芦,他會(huì)通過show processlist或show slave status 去自動(dòng)的找主蜻韭。
h= :服務(wù)器地址,命令里有2個(gè)ip柿扣,第一次出現(xiàn)的是Master的地址肖方,第2次是Slave的地址。
u= :帳號(hào)未状。
p= :密碼俯画。
--print :打印,但不執(zhí)行命令司草。
--execute :執(zhí)行命令艰垂。
pt-table-sync --replicate=pt.checksums h=10.0.0.11,u=root,p=123,P=3306 --print
2.5 mysql死鎖監(jiān)測(cè)
pt-deadlock-logger h='127.0.0.1' --user=root --password=123456
2.6 主鍵沖突檢查
pt-duplicate-key-checker --database=world h='127.0.0.1' --user=root --password=123456
pt-kill 語句
常用參數(shù)說明
--daemonize 放在后臺(tái)以守護(hù)進(jìn)程的形式運(yùn)行泡仗;
--interval 多久運(yùn)行一次,單位可以是s,m,h材泄,d等默認(rèn)是s –不加這個(gè)默認(rèn)是5秒
--victims 默認(rèn)是oldest,只殺最古老的查詢沮焕。這是防止被查殺是不是真的長時(shí)間運(yùn)行的查詢,他們只是長期等待 這種種匹配按時(shí)間查詢拉宗,殺死一個(gè)時(shí)間最高值峦树。
--all 殺掉所有滿足的線程
--kill-query 只殺掉連接執(zhí)行的語句,但是線程不會(huì)被終止
--print 打印滿足條件的語句
--busy-time 批次查詢已運(yùn)行的時(shí)間超過這個(gè)時(shí)間的線程旦事;
--idle-time 殺掉sleep 空閑了多少時(shí)間的連接線程魁巩,必須在--match-command sleep時(shí)才有效—也就是匹配使用 -- –match-command 匹配相關(guān)的語句。
----ignore-command 忽略相關(guān)的匹配姐浮。 這兩個(gè)搭配使用一定是ignore-commandd在前 match-command在后谷遂,
--match-db cdelzone 匹配哪個(gè)庫
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 &
---指定哪個(gè)用戶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 &
其他
pt-find ---找出幾天之前建立的表
pt-slave-restart -----主從報(bào)錯(cuò)蛤签,跳過報(bào)錯(cuò)
pt-summary ---整個(gè)系統(tǒng)的的概述
pt-mysql-summary ---MySQL的表述,包括配置文件的描述
pt-duplicate-key-checker ---檢查數(shù)據(jù)庫重復(fù)索引