官網:https://www.percona.com/downloads/percona-toolkit/LATEST/
percona-toolkit是一組高級命令行工具的集合,可以查看當前服務的摘要信息,磁盤檢測,分析慢查詢日誌,查找重複索引,實現表同步等等。
這個工具套件對DBA及運維人員着實不可多得
1,下載
wget https://www.percona.com/downloads/percona-toolkit/3.1.0/binary/redhat/7/x86_64/percona-toolkit-3.1.0-2.el7.x86_64.rpm
2,安裝
yum install -y percona-toolkit-3.1.0-2.el7.x86_64.rpm
3,驗證 安裝完成後會生成以下命令:
[root@huazai007 src]# pt
pt-align pt-fk-error-logger pt-pg-summary pt-summary
pt-archiver pt-heartbeat pt-pmp pt-table-checksum
ptaskset pt-index-usage pt-query-digest pt-table-sync
pt-config-diff pt-ioprofile pt-secure-collect pt-table-usage
pt-deadlock-logger pt-kill pt-show-grants pt-upgrade
pt-diskstats pt-mext pt-sift pt-variable-advisor
pt-duplicate-key-checker pt-mongodb-query-digest pt-slave-delay pt-visual-explain
pt-fifo-split pt-mongodb-summary pt-slave-find ptx
pt-find pt-mysql-summary pt-slave-restart
pt-fingerprint pt-online-schema-change pt-stalk
4 ,命令詳解
pt-upgrade
#該命令主要用於對比不同mysql版本下SQL執行的差異,通常用於升級前進行對比。
#會生成SQL文件或單獨的SQL語句在每個服務器上執行的結果、錯誤和警告信息等。
pt-online-schema-change
#功能爲支持在線變更表構,且不鎖定原表,不阻塞原表的DML操作。
#該特性與Oracle的dbms_redefinition在線重定義表原理基本類似。
pt-mysql-summary
#對連接的mysql服務器生成一份詳細的配置情況以及sataus信息
#在尾部也提供當前實例的的配置文件的信息
pt-mext
#並行查看SHOW GLOBAL STATUS的多個樣本的信息。
#pt-mext會執行你指定的COMMAND,並每次讀取一行結果,把空行分割的內容保存到一個一個的臨時文件中,最後結合這些臨時文件並行查看結果。
pt-kill
#Kill掉符合指定條件mysql語句
pt-ioprofile
#pt-ioprofile的原理是對某個pid附加一個strace進程進行IO分析
pt-fingerprint
#用於生成查詢指紋。主要將將sql查詢生成queryID,pt-query-digest中的ID即是通過此工具來完成的。
#類似於Oracle中的SQL_ID,涉及綁定變量,字面量等
pt-find
#用與查找mysql表並執行指定的命令,類似於find命令
pt-fifo-split
#模擬切割文件並通過管道傳遞給先入先出隊列而不用真正的切割文件
pt-deadlock-logger
#用於監控mysql服務器上死鎖並輸出到日誌文件,日誌包含發生死鎖的時間、死鎖線程id、死鎖的事務id、發生死鎖時事務執行時間等詳細信息。
pt-archiver
#將mysql數據庫中表的記錄歸檔到另外一個表或者文件
#該工具具只是歸檔舊的數據,對線上數據的OLTP查詢幾乎沒有影響。
#可以將數據插入另外一臺服務器的其他表中,也可以寫入到一個文件中,方便使用load data infile命令導入數據。
pt-agent
#基於Percona Cloud的一個客戶端代理工具
pt-visual-explain
#用於格式化explain的輸出
pt-variable-advisor
#用於分析mysql系統變量可能存在的一些問題,可以據此評估有關參數的設置正確與否。
pt-stalk
#用於收集mysql數據庫故障時的相關信息便於後續診斷處理。
pt-slave-delay
#用於設定從服務器落後於主服務器的時間間隔。
#該命令行通過啓動和停止複製sql線程來設置從落後於主指定時間。
pt-sift
#用於瀏覽pt-stalk生成的文件。
pt-show-grants
#將當前實例的用戶權限全部輸出,可以用於遷移數據庫過程中重建用戶。
pt-query-digest
#用於分析mysql服務器的慢查詢日誌,並格式化輸出以便於查看和分析。
pt-pmp
#爲查詢程序執行聚合的GDB堆棧跟蹤,先進性堆棧跟蹤,然後將跟蹤信息彙總。
pt-index-usage
#從log文件中讀取查詢語句,並用分析當前索引如何被使用。
#完成分析之後會生成一份關於索引沒有被查詢使用過的報告,可以用於分析報告考慮剔除無用的索引。
pt-heartbeat
#用於監控mysql複製架構的延遲。
#主要是通過在主庫上的--update線程持續更新指定表上的一個時間戳,從庫上--monitor線程或者--check線程檢查主庫更新的時間戳並與當前系統時間對比,得到延遲值。
pt-fk-error-logger
#將外鍵相關的錯誤信息記錄到日誌或表。
pt-duplicate-key-checker
#功能爲從mysql表中找出重複的索引和外鍵,這個工具會將重複的索引和外鍵都列出來
#同時也可以生成相應的drop index的語句
pt-diskstats
#類似於iostat,打印磁盤io統計信息,但是這個工具是交互式並且比iostat更詳細。可以分析從遠程機器收集的數據。
pt-config-diff
#用於比較mysql配置文件和服務器變量
#至少2個配置源需要指定,可以用於遷移或升級前後配置文件進行對比
pt-align
#格式化輸出
pt-slave-find
#連接mysql主服務器並查找其所有的從,然後打印出所有從服務器的層級關係。
pt-table-checksum
#用於校驗mysql複製的一致性。
#該工具主要是高效的查找數據差異,如果存在差異性,可以通過pt-table-sync來解決
5,安裝sysbench 性能壓測工具
yum -y install sysbench
壓測前的準備工作:
主庫上操作:
MariaDB [(none)]> create database sbtest;
MariaDB [(none)]> grant all on *.* to 'sbtest'@'172.18.47.110' identified by '123456';
MariaDB [(none)]> flush privileges;
1 pt-heartbeat
用於監控主從延遲的工具
1.1 pt-heartbeat 原理
主庫創建一張heartbeat表,表中有個時間戳字段。主庫上pt-heartbeat的update線程會在指定時間間隔更新時間戳。
從庫上的pt-heartbeat的monitor線程會檢查複製的心跳記錄,這個記錄就是主庫修改的時間戳。然後和當前系統時間進行對比,得出時間上的差異,差異值就是延遲的時間大小。由於heartbeat表中有server_id字段,在監控某個從庫的延遲時指定參考主庫的server_id即可。
1.2 pt-heartbeat 主要參數介紹
注意:需要指定的參數至少有 --stop,--update,--monitor,--check。
其中--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。
`--ask-pass`:隱式輸入MySQL密碼
`--charset`:字符集設置
`--check`:檢查從的延遲,檢查一次就退出,除非指定了--recurse會遞歸的檢查所有的從服務器。
`--check-read-only`:如果從服務器開啓了只讀模式,該工具會跳過任何插入。
`--create-table`:在主上創建心跳監控的表,如果該表不存在。可以自己建立,建議存儲引擎改成memory。通過更新該表知道主從延遲的差距。
CREATE TABLE heartbeat (
ts varchar(26) NOT NULL,
server_id int unsigned NOT NULL PRIMARY KEY,
file varchar(255) DEFAULT NULL, -- SHOW MASTER STATUS
position bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS
relay_master_log_file varchar(255) DEFAULT NULL, -- SHOW SLAVE STATUS
exec_master_log_pos bigint unsigned DEFAULT NULL -- SHOW SLAVE STATUS
);
heratbeat表一直在更改ts和position,而ts是我們檢查複製延遲的關鍵。
`--daemonize`:執行時,放入到後臺執行
`--user | -u`:連接數據庫的帳號
`--database | -D`:連接數據庫的名稱
`--host|-h`:連接的數據庫地址
`--password | -p`:連接數據庫的密碼
`--port | -P`:連接數據庫的端口
`--socket | -S`:連接數據庫的套接字文件
`--file 【--file=output.txt】`:打印--monitor最新的記錄到指定的文件,很好的防止滿屏幕都是數據的煩惱。
`--frames 【--frames=1m,2m,3m】`:在--monitor裏輸出的[]裏的記錄段,默認是1m,5m,15m。可以指定1個,如:--frames=1s,多個用逗號隔開。可用單位有秒(s)、分鐘(m)、小時(h)、天(d)。
`--interval`:檢查、更新的間隔時間。默認是見是1s。最小的單位是0.01s,最大精度爲小數點後兩位,因此0.015將調整至0.02。
`--log`:開啓daemonized模式的所有日誌將會被打印到制定的文件中。
`--monitor`:持續監控從的延遲情況。通過--interval指定的間隔時間,打印出從的延遲信息,通過--file則可以把這些信息打印到指定的文件。
`--master-server-id`:指定主的server_id,若沒有指定則該工具會連到主上查找其server_id。
`--print-master-server-id`:在--monitor和--check 模式下,指定該參數則打印出主的server_id。
`--recurse`:多級複製的檢查深度。模式M-S-S...不是最後的一個從都需要開啓log_slave_updates,這樣才能檢查到。
`--recursion-method`:指定複製檢查的方式,默認爲processlist,hosts。
`--update`:更新主上的心跳錶。
`--replace`:使用--replace代替--update模式更新心跳錶裏的時間字段,這樣的好處是不用管表裏是否有行。
`--stop`:停止運行該工具(--daemonize),在/tmp/目錄下創建一個“pt-heartbeat-sentinel” 文件。後面想重新開啓則需要把該臨時文件刪除,才能開啓(--daemonize)。
`--table`:指定心跳錶名,默認heartbeat。
1.3 pt-heartbeat 實戰
1): 主庫創建 heartbeat心跳錶,通過update執行更新時間戳,心跳錶指定建立在sbtest庫下
pt-heartbeat -S /var/lib/mysql/mysql.sock --database sbtest --update --create-table --daemonize
2): 主庫利用sysbench模擬數據操作
prepare:準備壓測數據 在sbtest庫裏建10張表,每張表裏插入50w條數據
run:執行壓測
cleanup:清除壓測數據
[root@huazai007 src]# sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-host='172.18.47.110' \
--mysql-user=sbtest \
--mysql-password=123456 \
--mysql-port=3306 \
--db-driver=mysql \
--mysql-db=sbtest \
--tables=10 \
--table-size=500000 \
--report-interval=10 \
--threads=128 \
--time=120 \
prepare|run|cleanup
3):從庫進行監測
[root@localhost src]# pt-heartbeat -S /var/lib/mysql/mysql.sock --master-server-id=1 --monitor --database sbtest
0.00s [ 8.57s, 66.24s, 22.64s ]
0.00s [ 6.40s, 66.22s, 22.64s ]
0.00s [ 4.25s, 66.20s, 22.64s ]
0.00s [ 2.10s, 66.18s, 22.64s ]
0.00s [ 0.00s, 66.15s, 22.64s ]
0.00s [ 0.00s, 66.12s, 22.64s ]
0.00s [ 0.00s, 66.09s, 22.64s ]
0.00s [ 0.00s, 66.06s, 22.64s ]
0.00s [ 0.00s, 66.02s, 22.64s ]
結果表示有延時0s左右,中括號中的數據分別表示1m,5m,15m的平均值
2 pt-slave-restart
pt-slave-restart是一個可以跳過特定錯誤並自動重啓slave的工具。
2.1 pt-slave-restart 原理
pt-slave-restart監控一個或者多個MySQL複製slave,試圖跳過引起錯誤的語句。它以指數變化的睡眠時間職能地檢查slave。你可以指定要跳過的錯誤然後運行slave一直到一個確定的binlog位置。
pt-slave-restart一旦檢測到slave有錯誤就會打印一行。默認情況下該打印行爲:時間戳、連接信息、relay_log_file,relay_log_pos,以及last_errno。你可以使用–verbose選項添加更多信息,也可以使用–quiet選項阻止所有輸出。
2.2 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的位置來停止
- `--sleep`:默認值爲1,檢查slave間隔的初始sleep秒數。
2.3 pt-slave-restart 實戰
#1. 在master上創建表
create table z1(id int not null,uname varchar(32),primary key(id));
#2. 在slave上插入數據
set sql_log_bin=0;
set global read_only=off;
insert into z1(id,uname) values(3,'python');
#3. 在master上插入數據
insert into z1(id,uname) values(2,'mysql');
insert into z1(id,uname) values(3,'java');
#4. 在slave上查看複製狀態
show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: No
...
Last_SQL_Errno: 1062
Last_SQL_Error: Could not execute Write_rows event on table test.z1; Duplicate entry '3' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log my3306_binlog.000071, end_log_pos 1214
#5. 在slave上使用pt-slave-restart跳過指定錯誤
[root@localhost src]# pt-slave-restart --error-numbers=1062
2019-12-12T16:54:56 mysql-relay.000006 1073644063 1062
#6. 在slave上查看複製狀態
···
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
···
#說明覆制已經正常,跳過了錯誤事務。
#但是master與slave上的這張表數據不一致,所以這種修復方法只能算暫時的。
#之後還需進行修復
3 pt-table-checksum
pt-table-checksum工具用來檢查主從數據一致性
3.1 pt-table-checksum 原理
pt-table-checksum用於校驗主從數據的一致性,該命令在主庫上執行校驗,然後對複製的一致性進行檢查,來對比主從之間的校驗值,並輸出對比結果
3.2 pt-table-checksum 主要參數介紹
- `--[no]check-replication-filters`:是否檢查複製的過濾器,默認是yes,建議啓用不檢查模式。
- `--databases | -d`:指定需要被檢查的數據庫,多個庫之間可以用逗號分隔。
- `--[no]check-binlog-format`:是否檢查binlog文件的格式,默認值yes。建議開啓不檢查。因爲在默認的row格式下會出錯。
- `--replicate`:把checksum的信息寫入到指定表中。
- `--replicate-check-only`:只顯示不同步信息
3.3 pt-table-checksum 實戰
主庫上操作:
[root@huazai007 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=172.18.47.110,u=huazai007,p=123456,P=3306
返回值:
# A software update is available:
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
12-16T16:45:46 0 1 2 0 1 0 0.147 test.z1
#解釋:
`TS` :完成檢查的時間。
`ERRORS` :檢查時候發生錯誤和警告的數量。
`DIFFS`:0表示一致,1表示不一致。當指定--no-replicate-check時,會一直爲0,當指定--replicate-check-only會顯示不同的信息。
`ROWS` :表的行數。
`CHUNKS` :被劃分到表中的塊的數目。
`SKIPPED` :由於錯誤或警告或過大,則跳過塊的數目。
`TIME` :執行的時間。
`TABLE` :被檢查的表名。
【注意】:
1)根據測試,需要一個即能登錄主庫,也能登錄從庫的賬號;huazai007 123456
2)只能指定一個host,必須爲主庫的IP;
3)在檢查時會向表加S鎖;
4)運行之前需要從庫的同步IO和SQL進程是YES狀態。
4 pt-table-sync
用來修復主從數據不一致
4.1 pt-table-sync 原理
pt-table-sync高效的同步MySQL表之間的數據,他可以做單向和雙向同步的表數據。他可以同步單個表,也可以同步整個庫。它不同步表結構、索引、或任何其他模式對象。所以在修復一致性之前需要保證他們表存在。
4.2 pt-table-sync 主要參數介紹
`--replicate` :指定通過pt-table-checksum得到的表,這2個工具差不多都會一直用。
`--databases` : 指定執行同步的數據庫。
`--tables` :指定執行同步的表,多個用逗號隔開。
`--sync-to-master` :指定一個DSN,即從的IP,他會通過show processlist或show slave status 去自動的找主。
`h=` :服務器地址,命令裏有2個ip,第一次出現的是Master的地址,第2次是Slave的地址。
`u=` :帳號。
`p=` :密碼。
`--print` :打印,但不執行命令。
`--execute :執行命令。
4.3 pt-table-sync 實戰
主庫上執行以下命令
#print 修復命令
會把修復的sql語句打印出來
[root@huazai007 ~]# pt-table-sync --replicate=test.checksums h=172.18.47.110,u=huazai007,p=123456,P=3306 h=172.18.47.112,u=huazai007,p=123456,P=3306 --print
REPLACE INTO `test`.`z1`(`id`, `uname`) VALUES ('3', 'java') /*percona-toolkit src_db:test src_tbl:z1 src_dsn:P=3306,h=172.18.47.110,p=...,u=huazai007 dst_db:test dst_tbl:z1 dst_dsn:P=3306,h=172.18.47.112,p=...,u=huazai007 lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:7027 user:root host:huazai007*/;
#execute 修復命令
[root@huazai007 ~]# pt-table-sync --replicate=test.checksums h=172.18.47.110,u=huazai007,p=123456,P=3306 h=172.18.47.112,u=huazai007,p=123456,P=3306 --execute
##再使用pt-table-checksum 驗證下
[root@huazai007 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=172.18.47.110,u=huazai007,p=123456,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
12-16T17:06:33 0 0 2 0 1 0 0.075 test.z1
分類: mysql