pt-table-checksum校驗主從一致性,使用pt-table-sync修復資料不一致

orclwujian發表於2016-12-13
pt-table-checksum和pt-table-sync是percona-toolkit(安裝文件請見http://blog.itpub.net/29989552/viewspace-2020786/)工具中的功能,用來檢測主從資料一致性和修復主從不一致。
下面透過一組實驗學習這兩個功能的使用

1、主庫建立表並插入資料
CREATE TABLE `NewTable` (
`id`  int(8) NULL ,
`name`  varchar(32) NULL ,
PRIMARY KEY (`id`)
) ;


insert into newtable values(1,'leo');
insert into newtable values(2,'mike');
insert into newtable values(3,'jack');

2、從庫執行下面語句,讓主從不一致
insert into newtable values(4,'lucy');
insert into newtable values(5,'petter');
update newtable set name='john' where id =1

3、測試資料如下
主庫:
mysql> select * from test.newtable;
+----+------+
| id | name |
+----+------+
|  1 | leo  |
|  2 | mike |
|  3 | jack |
+----+------+
3 rows in set (0.00 sec)
從庫:
mysql> select * from test.newtable;
+----+--------+
| id | name   |
+----+--------+
|  1 | john   |
|  2 | mike   |
|  3 | jack   |
|  4 | lucy   |
|  5 | petter |
+----+--------+
5 rows in set (0.00 sec)


4、pt-table-checksum引數介紹、使用
--port=              主庫埠
--host=              主庫IP
--databases=      校驗的資料庫
--tables=            校驗 的表名,只指定資料庫不指定表名,校驗資料庫下所有表
--user=               使用者名稱(該使用者在從庫上也要有,同時需要許可權)
--password=       使用者密碼
--replicate           指定checksum儲存的庫和表
--no-check-binlog-format      忽略binlog的格式,如果binlog是ROW或者MIXED不加這個引數都會報錯
--no-check-replication-filters  忽略複製過濾,如binlog_ignore_db、slave-skip-errors等選項
--help                  更多更詳細的引數請見--help幫助文件

校驗:
[root@trcloud ~]# pt-table-checksum --port=3306 --host=192.168.129.15 --databases=test --tables=newtable --user=root --password='123456' --replicate=test.check --no-check-binlog-format --no-check-replication-filters
            TS          ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME    TABLE
12-13T13:44:07      0           1           3             1           0            0.059  test.newtable
注:檢查的時候會向表加S鎖
TS:         完成的檢查時間
ERRORS:檢查時候發生的錯誤和告警數量
DIFFS:       0表示一致,1表示不一致
ROWS:    錶行數
CHUNKS:被劃分到表中的塊數量
SKIPPED: 由於錯誤跳過的數目
TIME:       執行時間
TABLE:      表名

5、使用pt-table-sync修復不一致
--replicate=   指定pt-table-checksum得到的表
h=                 主庫IP
u=                  使用者名稱
p=                 密碼
--execute       執行修復
--print            列印出sql語句
--help            更多更詳細的引數請見--help幫助文件

[root@trcloud ~]# pt-table-sync --replicate=test.check h=192.168.129.15,u=root,p='123456' --execute --print
DELETE FROM `test`.`newtable` WHERE `id`='4' LIMIT 1 /*percona-toolkit src_db:test src_tbl:newtable src_dsn:h=192.168.129.15,p=...,u=root dst_db:test dst_tbl:newtable dst_dsn:h=172.30.249.5,p=...,u=root lock:1 transaction:1 changing_src:test.check replicate:test.check bidirectional:0 pid:19211 user:root host:trcloud*/;
DELETE FROM `test`.`newtable` WHERE `id`='5' LIMIT 1 /*percona-toolkit src_db:test src_tbl:newtable src_dsn:h=192.168.129.15,p=...,u=root dst_db:test dst_tbl:newtable dst_dsn:h=172.30.249.5,p=...,u=root lock:1 transaction:1 changing_src:test.check replicate:test.check bidirectional:0 pid:19211 user:root host:trcloud*/;
REPLACE INTO `test`.`newtable`(`id`, `name`) VALUES ('1', 'leo') /*percona-toolkit src_db:test src_tbl:newtable src_dsn:h=192.168.129.15,p=...,u=root dst_db:test dst_tbl:newtable dst_dsn:h=172.30.249.5,p=...,u=root lock:1 transaction:1 changing_src:test.check replicate:test.check bidirectional:0 pid:19211 user:root host:trcloud*/;

從列印的sql來看,如果從庫資料多了使用delete刪除,其他情況修復主從不一致使用的是REPLACE INTO。所以表上一定要有主鍵,不然不僅會報錯,也會導致主從同步失敗(因為在從庫執行REPLACE INTO執行不過去)

6、檢查主從一致
[root@trcloud ~]# pt-table-checksum --port=3306 --host=192.168.129.15 --databases=test --tables=newtable --user=root --password='123456' --replicate=test.check --no-check-binlog-format --no-check-replication-filters
            TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
12-13T13:48:18      0      0        3       1       0   0.108 test.newtable
資料已經正常

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29989552/viewspace-2130390/,如需轉載,請註明出處,否則將追究法律責任。

相關文章