如何验证主从数据库数据内容一致

如题所述

用 pt-table-checksum 时,会不会影响业务性能?

实验


实验开始前,给大家分享一个小经验:任何性能评估,不要相信别人的评测结果,要在自己的环境上测试,并(大概)知晓原理。

我们先建一对主从:

然后用 mysqlslap跑一个持续的压力:

开另外一个会话,将 master 上的 general log 打开:

然后通过 pt-table-checksum 进行一次比较:

查看 master 的 general log,由于 mysqlslap 的影响,general log 中有很多内容,我们找到与 pt-table-checksum 相关的线程:

将该线程的操作单独列出来:

操作比较多,我们一点一点来说明:

这里工具调小了 innodb 锁等待时间。使得之后的操作,只要在 innodb 上稍微有锁等待,就会马上放弃操作,对业务影响很小。

另外工具调小了 wait_timeout 时间,倒是没有特别的作用。


工具将隔离级别调整为了 RR 级别,事务的维护代价会比 RC 要高,不过后面我们会看到工具使用的每个事务都很小,加上之前提到 innodb 锁等待时间调到很小,对线上业务产生的成本比较小。

RR 级别是数据对比的基本要求。

工具通过一系列操作,了解表的概况。工具是一个数据块一个数据块进行校验,这里获取了第一个数据块的下边界。

接下来工具获取了下一个数据块的下边界,每个 SQL前都会 EXPLAIN 一下,看一下执行成本,非常小心翼翼。

之后工具获取了一个数据块的 checksum,这个数据块不大,如果跟业务流量有冲突,会马上出发 innodb 的锁超时,立刻退让。

以上是 pt-table-checksum 的一些设计,可以看到这几处都是精心维护了业务流量不受影响。

工具还设计了其他的一些机制保障业务流量,比如参数 --max-load 和 --pause-file 等,还有精心设计的数据块划分方法,索引选择方法等。大家根据自己的情况配合使用即可达到很好的效果。


总结

本期我们介绍了简单分析 pt-table-checksum 是否会影响业务流量,坊间会流传工具的各种参数建议或者不建议使用,算命的情况比较多,大家都可以用简单的实验来分析其中机制。

还是那个观点,性能测试不能相信道听途说,得通过实验去分析。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-09-02

  percona-toolkit-2.2.8-1.noarch.rpm有两个工具可以验证MySQL主从数据的一致性
 
安装tookkit需要一些依赖包
 
yum install perl perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-Time-HiRes -y

  实验环境

  在Master上初始化实验数据
 
create database mvbox;
 
use mvbox;

  create table test(id int primary key,name varchar(20));

  insert into test values(1,'a'),(2,'b'),(3,'c'),(4,'d');

  因为主从环境已经搭建,这些数据会自动同步到Slave上。
 
在Slave从库添加一个数据,模拟主从数据不一致的场景。
 
insert into test values(5,'e');
 在Master主库执行pt-table-checksum命令。
 它会使用concat_ws函数将数据合并为一行,然后使用crc32函数生成校验码,最后将其插入percona库的checksums表中。
 
因为主从环境,这个数据会复制到Slave
 也就是说Slave的percona.checksums表,存放的是主库数据的校验码。
 所以在Slave对数据执行同样的校验,然后比对checksums表中的数据,就可以验证主从是否一致。
 
所以执行pt-table-checksum命令的帐号,至少需要有全库的只读权限和percona库的读写权限。
 
create user xx;
 
GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'xx'@'%' IDENTIFIED BY 'xx';

  grant all privileges on percona.* TO 'xx'@'%' IDENTIFIED BY 'xx';
 
查看主从一致的情况

  TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
 常用参数
 
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。
--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。 
--databases= :指定需要被检查的数据库,多个则用逗号隔开。
--tables= :指定需要被检查的表,多个用逗号隔开
h=127.0.0.1 :Master的地址
u=root :用户名
p=123456:密码
P=3306 :端口
 可以看到这个工具已经检测到了主从不一致的情况。
 
如果发生不一致,可以使用pt-table-sync命令修复。
 需要注意的是这个命令需要在Slave从库执行。
 使用print参数,他会在屏幕显示修复的SQL语句。然后可以手工确认并执行。

  也可以通过这个命令自动执行,不过这样会修改从库的数据,感觉不是太安全。
 

  需要特别注意的是这两个命令执行的过程中,会对表上共享锁,所以生产环境要慎重选择执行时间。

本回答被提问者和网友采纳

如何验证主从数据库数据内容一致
我们先建一对主从:然后用 mysqlslap跑一个持续的压力:开另外一个会话,将 master 上的 general log 打开:然后通过 pt-table-checksum 进行一次比较:查看 master 的 general log,由于 mysqlslap 的影响,general log 中有很多内容,我们找到与 pt-table-checksum 相关的线程:将该线程的操作单独列...

MySQL 主从复制数据不一致,怎么办?
1. 授权从机服务器:设置从机登录用户名和密码,限定登录地址,确保从机可以操作任意库中的任意表。注意,MySQL8中需分步进行用户创建和授权。2. 修改主库配置文件:开启binlog,设置server-id。配置完成后重启MySQL服务。3. 查看主服务器当前二进制日志名和偏移量:用于从机启动后的数据恢复。主从配置...

mysql主主同步,从库不同步应该怎么解决
由于各种原因,mysql主从架构经常会出现数据不一致的情况出现,大致归结为如下几类1:备库写数据2:执行non-deterministic query3:回滚掺杂事务表和非事务表的事务4:binlog或者relay log数据损坏数据不同步给应用带来的危害是致命的,当出现主从数据不一致的情况,常见的应对方法是先把从库下线,然后找个半夜...

redis与mysql怎么保证数据一致 redis与mysql保证数据一致步骤
1)读Redis:热数据基本都在Redis 2)写MySQL:增删改都是操作MySQL 3)更新Redis数据:MySQ的数据操作binlog,来更新到Redis 2、Redis更新。1)数据操作主要分为两大块:一个是全量(将全部数据一次写入到redis)一个是增量(实时更新)这里说的是增量,指的是mysql的update、insert、delate变更数据。2)...

如何恢复MySQL主从数据一致性
现在的问题很明确,就是如何恢复主从库数据的一致性。可选方案如下:一、查看Master最新的Position,将其作为Slave复制的起点。这种思路体现的是过去的不一致既往不咎,现在保持同步即可。看起来,这个思路和恢复主从库数据的一致性的初衷有所违背,但这种方法,简单,高效,在测试环境,对历史数据要求不高的...

如何处理MySQL数据不同步的情况mysql不同步的现象
一、检查数据库配置 当MySQL数据发生不同步的情况时,首先要检查数据库配置是否正确。数据库配置包括服务器配置、网络配置、用户权限等,任何一个方面的错误都可能导致数据不同步。可以通过查看错误日志和系统监视工具来定位问题,并对数据库配置进行逐一检查。二、使用主从复制 MySQL提供了主从复制的功能,可以...

如何检测mysql主从不同步
方法一:忽略错误后,继续同步 该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 解决:stop slave;表示跳过一步错误,后面的数字可变 set global sql_slave_skip_counter =1;start slave;之后再用mysql> show slave status\\G 查看:Slave_IO_Running: Yes S...

MySQL间的三台数据库同步3个mysql之间同步
1. 在各个数据库之间开启binlog功能。2. 启用一台MYSQL服务器的主从复制功能,当作中转服务器。3. 在中转服务器上安装mydumper,使用mydumper备份各个服务器的数据并拷贝到中转服务器。4. 在中转服务器上使用myloader将备份数据导入。总结:针对以上三种模式,我们可以根据不同的需求选择不同的同步方式,以...

什么是数据库的一致性?一致性弱意味着什么?nosql的弱一致
最终一致性允许在一段时间内停止写入,等待系统收敛到一致状态。许多分布式数据库如MySQL主从集群采用这一策略,但实现最终一致性存在不确定性的挑战,可能导致用户体验数据不一致。弱一致性是最宽松的一致性级别,数据写入后不能保证将来被读取。它适用于对数据一致性的容忍度较高的场景,但性能和技术实现...

MySQL主从备份数据镜像同步mysql中主从备份
一、MySQL主从备份 MySQL主从备份是通过建立主数据库和从数据库之间的关系,实现自动备份和恢复的技术。主数据库负责写数据,从数据库负责读数据,从而实现备份和负载均衡的效果。步骤如下:1、在主数据库(Master)创建一个名为syncuser的账户,并授权slave服务器(Slave)可以使用该账户同步主服务器数据。

相似回答