1. 程式人生 > 實用技巧 >5.percona-toolkit工具介紹

5.percona-toolkit工具介紹

percona-toolkit工具使用介紹

percona-toolkit工具使用介紹

1. pt-heartbeat

用於監控主從延遲的工具

1.1 pt-heartbeat 原理

  1. 主庫建立一張heartbeat表,表中有個時間戳欄位。主庫上pt-heartbeat的update執行緒會在指定時間間隔更新時間戳。
  2. 從庫上的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_filerelay_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