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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM