MySQL数据一致性检查工具
来源:互联网 发布:手机吉他效果器软件 编辑:程序博客网 时间:2024/04/29 17:52
数据的不一致常令DBA被客服或业务部门投诉,那么一致性便是耳根清净[虽然不能这么说]的良方
这里介绍MySQL官方的mysqldbcompare(python写的)和percona公司的pt-table-checksum(perl写的)
mysqldbcompare的作用是
在介绍pt-table-checksum之前,先看两组同学的测试
一些限制
① 表要有主键或唯一性索引,否则无法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秒
简单范例
这里介绍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
- MySQL数据一致性检查工具
- MySQL数据一致性检查的几个工具
- Maatkit工具,Mysql自动检测数据一致性
- Mysql半同步复制、数据一致性检查
- MySQL 使用pt-table-checksum 检查主从数据一致性
- 【分析】Ceph数据一致性检查
- 【分析】Ceph数据一致性检查
- 【分析】Ceph数据一致性检查
- 【分析】Ceph数据一致性检查
- 【分析】Ceph数据一致性检查
- 主从数据一致性检查修复工具pt-table-checksum,pt-table-sync使用
- MySQL数据一致性问题
- mysql集群数据一致性校验
- MySQL背后的数据一致性分析
- 如何恢复MySQL主从数据一致性
- redis与Mysql的数据一致性
- 【干货】分享总结:MySQL数据一致性
- 数据一致性
- mfc窗口中生成cmd窗口进行调试输出
- spring security 整合
- vmware虚拟机全屏快捷键
- ida debug android so
- 在QtCreator上 使用版本控制系统Git(一)
- MySQL数据一致性检查工具
- 让Tomcat支持中文文件名
- 面向接口编程详解(二)——编程实例
- 单例模式
- oracle存储过程
- static的作用
- 全屏显示对话框,(隐藏任务栏)
- tampermonkey应用二--Bit币提醒(第二版)
- 面向接口编程详解(三)——模式研究