验证MySQL主从一致性(pt-table-checksum&pt-table-sync)

percona-toolkit-2.2.8-1.noarch.rpm有两个工具可以验证MySQL主从数据的一致性

安装tookkit需要一些依赖包
  1. yum install perl perl-DBI perl-dbd-mysql perl-IO-Socket-SSL perl-Time-HiRes -y
实验环境

验证MySQL主从一致性(pt-table-checksum&pt-table-sync)



在Master上初始化实验数据
  1. create database mvBox;
  2. use mvBox;
  3. create table test(id int primary key,name varchar(20));
  4. insert into test values(1,'a'),(2,'b'),(3,'c'),(4,'d');
因为主从环境已经搭建,这些数据会自动同步到Slave上。

在Slave从库添加一个数据,模拟主从数据不一致的场景。
  1. insert into test values(5,'e');
在Master主库执行pt-table-checksum命令。
它会使用concat_ws函数将数据合并为一行,然后使用crc32函数生成校验码,最后将其插入percona库的checksums表中。

验证MySQL主从一致性(pt-table-checksum&pt-table-sync)


因为主从环境,这个数据会复制到Slave
也就是说Slave的percona.checksums表,存放的是主库数据的校验码。
所以在Slave对数据执行同样的校验,然后比对checksums表中的数据,就可以验证主从是否一致。

所以执行pt-table-checksum命令的帐号,至少需要有全库的只读权限和percona库的读写权限。
  1. create user xx;
  2. GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO'xx'@'%' IDENTIFIED BY 'xx';
  3. grant all privileges on percona.* TO'xx'@'%' IDENTIFIED BY 'xx';

查看主从一致的情况

验证MySQL主从一致性(pt-table-checksum&pt-table-sync)


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

如果发生不一致,可以使用pt-table-sync命令修复。
需要注意的是这个命令需要在Slave从库执行。
使用print参数,他会在屏幕显示修复的sql语句。然后可以手工确认并执行。

验证MySQL主从一致性(pt-table-checksum&pt-table-sync)



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

验证MySQL主从一致性(pt-table-checksum&pt-table-sync)


验证MySQL主从一致性(pt-table-checksum&pt-table-sync)



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

参考:
http://nettedfish.sinaapp.com/blog/2013/06/04/check-replication-consistency-by-pt-table-checksum/
http://www.cnblogs.com/zhoujinyi/archive/2013/05/09/3067045.html
http://blog.chinaunix.net/uid-16844903-id-3360228.html

相关文章

MySQL 死锁 是指两个或多个事务互相等待对方持有的锁,从而导...
在MySQL中,InnoDB引擎通过Next-Key Locking技术来解决幻读问...
在数据库事务管理中,Undo Log 和 Redo Log 是两种关键日志,...
case when概述 sql语句中的case语句与高级语言中的switch语句...
其实很简单,只是为了忘记,做个记录,用的时候方便。 不管是...
1.进入服务,找到mysql服务,在属性里找到mysql的安装路径 2...