1.前言
在mysql数据库主从环境,总会出现各种原因,导致数据库主从环境的不一致;本文就是介绍在mysql数据库主从出现了不一致的情况,如何进行修复,保持数据的一致性。
本文使用:percona-toolk,这个工具包提供pt-table-checksum(检查数据),pt-table-sync修复数据两个命令行工具来实现mysql数据库主从的检查以及修复,在网上分享的mysql主从一致性检查原理的技术上,添加了实战操作部分。
2.使用pt-table-checksums检查主从同步一致性
它通过在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库,并在从库上计算相同数据块的checksum,最后,比较主从库上相同数据块的checksum值,由此判断主从数据是否一致。这种校验是分表进行的,在每个表内部又是分块进行的,而且pt工具本身提供了非常多的限流选项,因此对线上服务的冲击较小。
pt工具选择智能分析表上的索引,然后把表的数据split成一个个chunk,计算的时候也是以chunk为单位。每一次对chunk进行checksum后,pt工具都会对耗时进行统计分析,并智能调整下一个chunk的大小,避免chunk太大对线上造成影响,同时也要避免chunk太小而效率低下。
3.使用pt-table-sync修复主从不一致
使用pt-table-sync修复主从不一致,它用来修复多个实例之间数据的不一致。它可以让主从的数据修复到最终一致,也可以使通过应用双写或多写的多个不相关的数据库实例修复到一致。同时它还内部集成了pt-table-checksum的校验功能,可以一边校验一边修复,也可以基于pt-table-checksum的计算结果来进行修复。
4.实战修复主从不一致
4.1.模拟主从不同步
手动在主库建立一个willtest的表,并且在从库使用root用户删除willtest表中的一行数据,来模拟主从故障。
主库数据如下:
MariaDB [cms]> select * from willtest; +-------+-------+ | test1 | test2 | +-------+-------+ | 1 | 2 | | 2 | 3 | | 3 | 4 | | 4 | 5 | +-------+-------+
从库数据如下:
MariaDB [cms]> select * from willtest; +-------+-------+ | test1 | test2 | +-------+-------+ | 2 | 3 | | 3 | 4 | | 4 | 5 | +-------+-------+
4.2.环境安装
1、安装percona-toolk,这个工具包提供pt-table-checksum(检查数据),pt-table-sync(修复数据)两个命令行工具
wget https://www.percona.com/downloads/percona-toolkit/2.1.8/percona-toolkit-2.1.8-1.noarch.rpm rpm -ivh percona-toolkit-2.1.8-1.noarch.rpm
2、创建检查用户(主从库都需要创建),需要有修复库的和percona库的所有权限
GRANT all ON *.* TO 'will'@'%' IDENTIFIED BY 'will';
3、设置mysql主从同步percona数据库
# vim /etc/my.cnf replicate_do_db=percona
4.3.主从同步检查
在mysql主库执行如下命令来验证主从是否同步:
# pt-table-checksum --user=will --password=will --host=192.168.10.51 --databases=cms --no-check-binlog-format --no-check-replication-filters
执行结果如下:主要看DIFFS字段值,如果不为零说明有数据不一致的情况
参数说明: 执行结果显示参数意义: TS :完成检查的时间。 ERRORS :检查时候发生错误和警告的数量。 DIFFS :0表示一致,大于0表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。 ROWS :表的行数。 CHUNKS :被划分到表中的块的数目。 比如个表N条记录,那么会分成几十个chunks 每个N行的去检测 SKIPPED :由于错误或警告或过大,则跳过块的数目。 TIME :执行的时间。 TABLE :被检查的表名。
4.4.主从同步修复
根据校验结果,查看与主库不一致修复语句
也可以使用–execute选项直接修复
# pt-table-sync --replicate=percona.checksums --databases=cms --sync-to-master h='192.168.10.52',P='3306',u='will',p='will' --execute
修复完成,再重新校验一次,可以看到主从数据已经正常了