5.percona-toolkit工具介紹
percona-toolkit工具使用介紹
percona-toolkit工具使用介紹
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 /tmp/mysql3306.sock --database sbtest --update --create-table --daemonize
2)主庫利用sysbench模擬資料操作
sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-socket=/tmp/mysql3306.sock \
--mysql-user=root \
--mysql-password=mysql \
--mysql-db=sbtest \
--db-driver=mysql \
--tables=10 \
--table-size=500000 \
--report-interval=10 \
--threads=128 \
--time=120 \
prepare|run|cleanup
prepare:準備資料,
run:執行壓測,
cleanup:清除資料
3)從庫進行監控
pt-heartbeat -S /tmp/mysql3306.sock --master-server-id=1003306 --monitor --database sbtest
1.00s [ 0.02s, 0.00s, 0.00s ]
1.00s [ 0.03s, 0.01s, 0.00s ]
0.86s [ 0.05s, 0.01s, 0.00s ]
0.86s [ 0.06s, 0.01s, 0.00s ]
0.96s [ 0.08s, 0.02s, 0.01s ]
1.00s [ 0.09s, 0.02s, 0.01s ]
0.88s [ 0.11s, 0.02s, 0.01s ]
0.00s [ 0.11s, 0.02s, 0.01s ]
1.01s [ 0.13s, 0.03s, 0.01s ]
0.00s [ 0.13s, 0.03s, 0.01s ]
0.00s [ 0.13s, 0.03s, 0.01s ]
...
結果表示有延時1s左右,中括號中的資料分別表示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
選項阻止所有輸出。
SLEEP
pt-slave-restart
檢查slave的過程中智慧地sleep。當前的sleep時間是變化的。
- 初始sleep時間通過
--sleep
選項給出。 - 如果檢測發現錯誤,它對半之前的sleep時間。
- 如果檢測到沒有錯誤,它倍增之前的sleep時間。
- 通過
--min-sleep
和--max-sleep
引數限定sleep時間的下界和上界。 - 一旦檢測到錯誤,pt-slave-restart假定接下來很可能發生另一個錯誤,因此它採用當前的sleep時間或者初始sleep時間,取決於哪個值更小。
注意:
從Percona Toolkit 2.2.8版本起,pt-slave-restart開始支援由MySQL 5.6.5版本引入的GTID複製。重點牢記:當採用多執行緒複製(slave_parallel_workers > 0)時,pt-slave-restart不能跳過事務。pt-slave-restart不能確定GTID事件是哪個特定slave執行緒執行失敗的事務。
預設行為是跳過來自master的下一個事務。寫可以來自不同的伺服器,每個伺服器都有它自己的UUID。參考–master-uuid選項。
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跳過指定錯誤
pt-slave-restart --error-numbers=1062
2018-09-19T15:24:02 mysqldb2-relay-bin.000019 1088 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 實戰
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=192.168.56.100,u=wanbin,p=mysql,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
09-19T15:58:29 0 1 2 0 1 0 0.086 test.z1
#解釋:
`TS` :完成檢查的時間。
`ERRORS` :檢查時候發生錯誤和警告的數量。
`DIFFS`:0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的資訊。
`ROWS` :表的行數。
`CHUNKS` :被劃分到表中的塊的數目。
`SKIPPED` :由於錯誤或警告或過大,則跳過塊的數目。
`TIME` :執行的時間。
`TABLE` :被檢查的表名。
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --replicate-check-only h=192.168.56.100,u=wanbin,p=mysql,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
Differences on mysqldb2
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.z1 1 -1 1
【注意】:
1)根據測試,需要一個即能登入主庫,也能登入從庫的賬號;
2)只能指定一個host,必須為主庫的IP;
3)在檢查時會向表加S鎖;
4)執行之前需要從庫的同步IO和SQL程序是YES狀態。
4. pt-table-sync
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修復命令
pt-table-sync --replicate=test.checksums h=192.168.56.100,u=wanbin,p=mysql,P=3306 h=192.168.56.200,u=wanbin,p=mysql,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=192.168.56.100,p=...,u=wanbin dst_db:test dst_tbl:z1 dst_dsn:P=3306,h=mysqldb2,p=...,u=wanbin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:4374 user:root host:mysqldb1*/;
#execute修復命令
pt-table-sync --replicate=test.checksums h=192.168.56.100,u=wanbin,p=mysql,P=3306 h=192.168.56.200,u=wanbin,p=mysql,P=3306 --execute
#再使用pt-table-checksum
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=192.168.56.100,u=wanbin,p=mysql,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
09-19T16:11:50 0 0 2 0 1 0 0.134 test.z1
【注意】:要是表中沒有唯一索引或則主鍵則會報錯:
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.
轉載於https://www.cnblogs.com/wanbin/p/9899598.html