Percona Toolkit簡稱pt工具—PT-Tools,是Percona公司開發用於管理MySQL的工具,功能包括檢查主從複製的數據一致性、檢查重複索引、定位IO佔用高的表文件、在線DDL等mysql
下載地址爲: https://www.percona.com/downloads/percona-toolkit/LATEST/web
安裝:sql
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的在線歸檔,無影響生產mongodb
2.pt-kill -----自定義查殺。確保慢查詢及惡性攻擊對生產無影響 數據庫
3.pt-online-schema-change ----在線DDL操做,對上億的大表加索引加字段且對生產無影響 json
4.pt-query-digest -----慢查詢Log的分析。服務器
5.pt-slave-delay ---就是指定從庫比主庫延遲多長時間 網絡
6.pt-table-checksum & pt-table-sync-----檢查主從是否一致性-----檢查主從不一致以後用這個工具進行處理 這兩個一搬是搭配使用 socket
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 就能夠