做了m/s的mysql,特别是用于备份和读写分离的业务时,定期做主从数据一致性检查就应该是必须的。有时候不做不知道,做了吓一跳...谁也不想辛辛苦苦从slave备份出来的数据到最后只是一堆数据垃圾。目前发现比较好用的工具就只有一个,maatkit的mk-table-checksum。

  这个工具其中一种实现模式的最最简单原理就是,在master中校验指定库或者表或者全部库表,把结果存在自己创建的一个库表里,然后通过主从复制,相关的检验sql会传到slave上再执行一次,最后比较主从的检验值即可知道数据是否一致。这种模式的好处是利用主从复制来做检验,不需要在检验期间对主从数据库同时锁表,而且可以控制校验的数据和速度,使这个操作不至于影响到正常的服务。更详细的原理可以猛击这里(http://www.maatkit.org/doc/mk-table-checksum.html)来查看官方文档。

 工具的使用还是需要一些的设置:

  1. 安装maatkit
  我现在使用的是:maatkit-6926.tar.gz,已经有更新的版本了,但还没时间测试。安装时缺什么perl模块就装什么模块,最主要是DBI和DBD-mysql这两个perl模块。安装详情可看官网。
  2. 设置用户和权限
  创建一个用户,例如monitor,在master上授权:
    grant select,process,replication slave on *.* to monitor@'localhost' identified by 'xxxxxx';
  设置这几个权限都是按功能需要添加,具体就不解释,尝试一下就知道。

  在slave上授权:
    grant replication slave,replication client,select,process on *.* to monitor@'master的IP' identified by 'xxxxxx';
  3. 创建一个存储检验数据用的库,名字自定义,例如:monitor。并授权monitor用户操作此库的所有权限:
    grant all on monitor.* to monitor@'localhost' ;
  4. 基本到这一步就可以开始做检验了,mk-table-checksum这个脚本的使用方法官网的e文讲得灰常清楚简洁,所以我不啰嗦。我常用的参数是:
    mk-table-checksum --replicate=monitor.checksum --empty-replicate-table --create-replicate-table --recursion-method=hosts --sleep 5 h=localhost,u=monitor,p=xxxxxx --nocheck-replication-filters
  --replicate :指定检验数据存放的库和表
  --empty-replicate-table:检验前先清空以前的检验数据
  --create-replicate-table:存放检验数据的表如果不存在,则自动创建
  --recursion-method:查找slave的方式,有hosts和processlist两种。前者是用show slave hosts来查找,这种方式适合服务器的端口和socket之类的不使用默认参数的情况;后者是用show processlist来查找。
  --sleep:每检验完一个chunk或者一个表时停顿多少秒,这个可以减轻机器繁忙时锁表的情况和降低系统负载
  h=xx,u=xx,p=xx:登录master的参数
  --nocheck-replication-filters:6924这个版本才开始有的参数,mk-table-checksum检验前会检查slave是否存在ignore某个库或者表的情况,如果有出于安全考虑就会停止检验(是什么安全问题你懂的),除非添加上这个参数,忽略掉警告。
  当然我上面的命令是对全部数据库做检验,另外还有一些常用的参数,例如,--chunk-size, --databases, --tables, 以及它们的正则参数等等,更多的参数还是看看官档或者--help一下。
  5. 检验完之后在master上检查一下结果即可:
   mk-table-checksum --replicate=monitor.checksum --recursion-method=hosts --replicate-check 1 h=localhost,u=monitor,p=xxxxxx --nocheck-replication-filters
  如果无任何结果返回,则表示主从数据是一致的,如果有结果返回,恭喜,当然就是有问题啦。

参考资料
[1]. maatkit官方文档 http://www.maatkit.org