MySQL数据一致性检查工具

来源:互联网 发布:手机吉他效果器软件 编辑:程序博客网 时间:2024/04/29 17:52
数据的不一致常令DBA被客服或业务部门投诉,那么一致性便是耳根清净[虽然不能这么说]的良方
这里介绍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

原创粉丝点击