MySQL数据一致性检查工具

数据的不一致常令DBA被客服或业务部门投诉,那么一致性便是耳根清净[虽然不能这么说]的良方
这里介绍MySQL官方的mysqldbcompare(python写的)和percona公司的pt-table-checksum(perl写的)

mysqldbcompare的作用是

对比两个数据库的表结构、表数据的一致性并能生成对应补偿的SQL,如主备、线上线下

MySQL数据一致性检查工具_第1张图片

对于差异的展现能通过参数--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:[email protected]: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之前,先看两组同学的测试




MySQL数据一致性检查工具_第2张图片


文档有句非常霸气的话:
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

你可能感兴趣的:(MySQL,操作与管理,MySQL,安全和工具)