这里介绍MySQL官方的mysqldbcompare(python写的)和percona公司的pt-table-checksum(perl写的)
mysqldbcompare的作用是
对比两个数据库的表结构、表数据的一致性并能生成对应补偿的SQL,如主备、线上线下

对于差异的展现能通过参数--difftype调控
① unified (default)
② context
③ differ
④ sql
例子
mysql> select * from db1.t;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
+----+------+
3 rows in set (0.00 sec)
mysql> select * from db2.t;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | d |
| 3 | c |
+----+------+
3 rows in set (0.00 sec)
[mysql@odd ~]$ mysqldbcompare --server1=root:oracle@localhost --server2=root:oracle@192.168.15.133:3306 db1:db2 --changes-for=server1 --run-all-tests --difftype=sql
# server1 on localhost: ... connected.
# server2 on 192.168.15.133: ... connected.
# Checking databases db1 on server1 and db2 on server2
#
# WARNING: Cannot generate SQL statements for these objects.
# Check the difference output for other discrepencies.
--- `db1`
+++ `db2`
@@ -1 +1 @@
-CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */
+CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET latin1 */
# WARNING: Could not generate changes for {0}. No changes required or not supported difference.
# WARNING: Cannot generate SQL statements for these objects.
# Check the difference output for other discrepencies.
--- `db1`
+++ `db2`
@@ -1 +1 @@
-CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */
+CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET latin1 */
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# TABLE t pass pass FAIL
#
# Transformation for --changes-for=server1:
#
# Data differences found among rows:
UPDATE `db1`.`t` SET `name` = \'d\' WHERE `id` = \'2\';
# Database consistency check failed.
#
# ...done
在介绍pt-table-checksum之前,先看两组同学的测试


文档有句非常霸气的话:
No matter how large the server is, pt-table-checksum works equally well.
底气就在于Percona将表split成一个个chunk,基于chunk计算crc32值,每次checksum后
都会采集并分析Server的性能信息,并以此来调整chunk大小,避免对线上业务造成冲击
而且这只是其中一个比较耀眼的安全措施,当然文档还解释了很多保护服务器的特性
校验结束后,在每个从库上,执行如下的sql语句即可看到是否有主从不一致发生:
select * from percona.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc) \G
一些限制
① 表要有主键或唯一性索引,否则无法chunk表
② 主备checksum的库和表需要完全相同
③ binlog_format必须是statement模式
重要参数
安全选项:
–check-replication-filters 是否检查复制过滤规则
–check-slave-tables 检查是否所有从库都有被检查的表和列
–chunk-size-limit 每个chunk最大不能超过这个大小,超过就忽略它
限速选项:
–check-interval 多久检查一次主从延迟、主库负载是否达到上限
–check-slave-lag 是否只检查这个从库的延迟
–max-lag 最大延迟,超过这个就等待
–max-load 最大负载,超过这个就等待
过滤选项:
–databases 只检查某些库
–tables 只检查某些表
这些过滤选项在修复不一致数据后,检查修复效果很有用。
其他选项
–resume 因某种原因中断,下次接着执行,不用从头开始
–chunk-time 每个chunk被计算的时间,一般默认为0.5秒
简单范例
# pt-table-checksum --user=root --password=oracle --recursion-method=processlist
参考资料
http://dev.mysql.com/doc/workbench/en/mysqldbcompare.html
http://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html
http://nettedfish.sinaapp.com/blog/2013/06/04/check-replication-consistency-by-pt-table-checksum/
By 迦夜
2013-11-8
Good Luck