主从一致性效验和修复

安装工具包

下载地址:https://www.percona.com/downloads/percona-toolkit/LATEST/

toolkit文档:https://www.percona.com/doc/percona-toolkit/LATEST/index.html

wget https://downloads.percona.com/downloads/percona-toolkit/3.3.1/binary/redhat/7/x86_64/percona-toolkit-3.3.1-1.el7.x86_64.rpm

yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-TermReadKey perl-IO-Socket-SSL perl-Digest-MD5 -y

yum -y install percona-toolkit-3.3.1-1.el7.x86_64.rpm

pt-table-checksum检验主从一致

https://www.percona.com/doc/percona-toolkit/LATEST/pt-table-checksum.html

检测:

指定主的某个库

[root@localhost ~]# pt-table-checksum --nocheck-replication-filters --replicate=db.checksums --databases=test h=192.168.190.128,u=root,p=123456,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
08-27T14:59:23      0      0        3          0       1       0   0.029 test.t
08-27T14:59:23      0      0        1          0       1       0   0.062 test.t2

指标含义:

指标 含义
TS 工具完成表校验和时的时间戳(不含年份)
ERRORS 检查时候发生错误和警告的数量。在表格处理过程中,错误和警告被打印为标准错误。
DIFFS 0表示一致,1表示不一致。如果--no-replicate-check指定,此列将始终为零。如果[--replicate-check-only]指定,则仅打印有差异的表。
ROWS 表效验的行数,如果使用 –where 选项,它可能与表中的行数不同
DIFF_ROWS 差异的行数。如果一个块有 2 个不同的行而另一个块有 3 个不同的行,则该值将为 3。
CHUNKS 被划分到表中的块的数目
SKIPPED 由于错误或警告或过大,则跳过块的数目
TIME 执行的时间
TABLE 被检查的表名

参数含义:

参数 含义
-–nocheck-replication-filters 不检查复制过滤器,建议启用。
-–no-check-binlog-format 检查binlog_format所有服务器上是否相同。默认检查。
-–replicate= 把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。默认值:percona.checksums
–-databases= 指定需要被检查的数据库,多个则用逗号隔开。
–-tables= 指定需要被检查的表,多个用逗号隔开
-h,-u,-p,-P 指的master

pt-table-sync恢复主从一致

https://www.percona.com/doc/percona-toolkit/LATEST/pt-table-sync.html

--print 打印,不执行(可以打印出sql去从库执行,不execute)

--execute 执行

https://www.percona.com/doc/percona-toolkit/LATEST/pt-table-sync.html#dsn-options

严格来说,不需要使用 [--replicate]指定之前的差异表,没有必要。他会自动寻找

工具很严禁,语法上一定要遵守复制安全规范

示例:

从库数据与主不一致

pt-table-sync在执行时,若表没有唯一索引或主键,会报错,在复制安全中有详细原因
--sync-to-master slave1 ,指同步master到slave1

128主 129从

#从库上插入一条数据
insert into t values(4);

#检查差异之后可以指定--replicate=db.checksums来恢复
#恢复到主从一致
[root@localhost ~]# pt-table-sync --databases=test --no-check-slave h=192.168.190.128,u=root,p=123456 h=192.168.190.129,u=root,p=123456 --print --execute
DELETE FROM `test`.`t` WHERE `a`='4' LIMIT 1 /*percona-toolkit src_db:test src_tbl:t src_dsn:h=192.168.190.128,p=...,u=root dst_db:test dst_tbl:t dst_dsn:h=192.168.190.129,p=...,u=root lock:0 transaction:1 changing_src:0 replicate:0 bidirectional:0 pid:95924 user:root host:localhost.localdomain*/;


#从删除t2表的三条数据,在主上恢复
[root@localhost ~]# pt-table-sync --sync-to-master h=192.168.190.129,u=root,p=123456,P=3306 --databases=test --print --execute
REPLACE INTO `test`.`t2`(`a`) VALUES ('1') /*percona-toolkit src_db:test src_tbl:t2 src_dsn:P=3306,h=192.168.190.128,p=...,u=root dst_db:test dst_tbl:t2 dst_dsn:P=3306,h=192.168.190.129,p=...,u=root lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:108592 user:root host:localhost.localdomain*/;
REPLACE INTO `test`.`t2`(`a`) VALUES ('2') /*percona-toolkit src_db:test src_tbl:t2 src_dsn:P=3306,h=192.168.190.128,p=...,u=root dst_db:test dst_tbl:t2 dst_dsn:P=3306,h=192.168.190.129,p=...,u=root lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:108592 user:root host:localhost.localdomain*/;
REPLACE INTO `test`.`t2`(`a`) VALUES ('3') /*percona-toolkit src_db:test src_tbl:t2 src_dsn:P=3306,h=192.168.190.128,p=...,u=root dst_db:test dst_tbl:t2 dst_dsn:P=3306,h=192.168.190.129,p=...,u=root lock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:108592 user:root host:localhost.localdomain*/;


#效验并同步
pt-table-sync --replicate db.checksums h=192.168.190.128,u=root,p=123456,P=3306 h=192.168.190.129,u=root,p=123456,P=3306 --print --execute
posted @ 2021-08-27 17:19  EverEternity  阅读(97)  评论(0编辑  收藏  举报