欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mysql主从数据一致性校验及纠错工具

程序员文章站 2022-05-09 15:42:23
...

目录1、概述2、percona-tooldit工具的安装3、新建用户4、pt-table-checksum使用5、pt-table-sync使用6、个人总结1、概述假如你是一位运维人员,假如你生产环境上

目录

1、概述

2、percona-tooldit工具的安装

3、新建用户

4、pt-table-checksum使用

5、pt-table-sync使用

6、个人总结

1、概述

假如你是一位运维人员,假如你生产环境上部署了mysql系统,再假如你线上的mysql是基于主从复制的架构,那恭喜你,它将可能会带给你主从数据不一致的"恶运"。

由于mysql复制架构原生特性,主从服务器上的数据不可能做”同步“复制,所以延时是必然会有的,即使是不那么繁忙的服务器上,在业务不繁忙的时间里,从库能追上主库的进度,也可能会因为从服务器崩溃、非法关机、程序bug等因素导致在主库上写入的数据与从库上写入的数据不一致的问题。而当这种情况发生时,mysql内部是没有相应的机制来检测主从数据一致性的,对用户而言,你是不知道主从数据已经不一致了。

所以需要一种工具来解决这样的问题,而percona-toolkit工具集中的pt-table-checksum工具就是能在几乎不影响mysql性能的前提下高效的,能检测主从数据不一致的工具。当数据不一致真正产生后,percona-tools工具集中也提供了pt-table-sync工具来修复不一致的数据,这样可免去重新部署从服务器的麻烦。

然而在真正的生产环境上,这两个工具还是有一定的局限性,准确的说应该是mysql这种异步复制的架构导致了工具在使用上的局限性,因为从库会慢于主库,所以在校验主库上的表与校验从库上的表时往往数据是不一致的,这个不致是由于从库的延迟而导致的,所以这两个工具最好运用在以下场景:

a)、从服务器提升为主服务器时,在新的主服务器上线时需要与旧的主服务器进行数据一致性检查

b)、数据迁移后,应该进行数据一致性检查

c)、从库被误操作导致数据更新后,应该进行一致性检查

d)、计划内的数据一致性检查

以下的演示是基于一文中搭建的主从复制环境。

2、percona-toolkit工具的安装

先安装所依赖的包及percona-toolkit:

[root@master ~] yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-IO-Socket-SSL [root@master ~] rpm -ivh percona-toolkit-2.2.13-1.noarch.rpm

3、新建用户

创建一个非root权限的用户来专门进行数据一致检测等工作,pt-table-checksum与pt-table-sync需要连接到从库中进行相应的数据查看、数据修改等操作,所以在主库上创建一个这样的用户:

mysql> GRANT select,insert,update,delete,create,process,super,replication slave ON *.* TO monitor@'192.168.0.%' IDENTIFIED BY '111111'; Query OK, 0 rows affected (0.01 sec) mysql> GRANT select,insert,update,delete,create,process,super,replication slave ON *.* TO monitor@'127.0.0.1' IDENTIFIED BY '111111'; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)

用户新建好后请测试是否能正常接入主库和备库(因为这个用户也需要连接主库,所以创建了上边两个用户)。这个用户所需要的权限真不少,没办法,这是由于percona-toolkit中那两个工具的工作原理所需要的权限,如果为了省事,,也可直接给予ALL的权限。

4、pt-table-checksum使用

在mydb1库中的tb1表作为测试,在主库上查看tb1的内容:

mysql> SELECT * FROM mydb1.tb1; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | tom | 12 | | 2 | jem | 23 | | 3 | jason | 29 | | 4 | aaa | 30 | | 5 | b | 69 | +----+-------+------+ 5 rows in set (0.01 sec)

在从库上查看mydb1.tb1的内容:

mysql> select * from mydb1.tb1; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | tom | 12 | | 2 | jem | 23 | | 3 | jason | 29 | | 4 | aaa | 30 | | 5 | b | 69 | +----+-------+------+ 5 rows in set (0.00 sec)

此时主从的数据都是一致的,用pt-table-checksum工具测试一下看输出的是什么结果:

[root@master ~]# pt-table-checksum --nocheck-replication-filters --replicate=mydb1.checksums --databases=mydb1 h=127.0.0.1,u=monitor,p=111111 Replica slave has binlog_format ROW which could cause pt-table-checksum to break replication. Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation. If you understand the risks, specify --no-check-binlog-format to disable this check. #报错了,因为我的mysql环境的二进制日志是基于行的,即‘binlog_format=ROW’,如果是基于行的复制环境,percona官方是不建议使用pt-table-checksum工具来进行数据的一致性检查的,但它又提供了一个选项来跳过此检查。

各常用选项意义:

--nocheck-replication-filters:不检查复制过虑,我们用--databases来指定需要检查的数据库

--replicate:把校验的信息写入指定的表中

--no-check-binlog-format:不检查二进制日志文件格式

--replicate-check-only:只显示有不一致数据的信息

--databases:指定校验的数据库,多个用逗号隔开

--tables:指定校验的表,多个用逗号隔开

h:主机,指主服务器IP

u:帐号

p:密码