主从一致性效验和修复
安装工具包
下载地址: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