主从数据校验使用percona-toolkit工具集的以下两个工具(主库上使用):

pt-table-checksum  #检查主从数据是否一致,

pt-table-sync #把主库数据同步到从库

适用场景如下:

1). 数据迁移前后进行数据一致性检查

2). 当主从复制出现报错中断或者主从数据出现不一致时,对主从数据进行一致性检查并进行修复

3). 在从库上执行了误操作

4). 定期进行校验(如每个月对复制环境进行校验以确定复制是一致的)

原理:

pt-table-checksum在主库上利用SBR格式对一段数据做hashcode函数运算,然后复制到从库上去检查,对比这个hashcode结果是否一样。

常用参数:

--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。

--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。

--replicate-check-only :只显示不同步的信息。

--replicate=s:把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。

--databases :指定需要被检查的数据库,多个则用逗号隔开。

--tables :指定需要被检查的表,多个用逗号隔开

--host=s,h=127.0.0.1 :Master的地址

--user=s,u=root :用户名

--password=s,p=123456:密码

--port=i,P=3306 :端口

--recursion-method=a   #发现从库的参数,建议用processlist

METHOD       USES

===========  =============================================

processlist  SHOW PROCESSLIST

hosts        SHOW SLAVE HOSTS

cluster      SHOW STATUS LIKE 'wsrep\_incoming\_addresses'

dsn=DSN      DSNs from a table

none         Do not find slaves

注意:

用于执行pt-table-checksum命令的用户必须要有super权限,以可以修改一些变量信息(如:binlog_format变量在执行这个命令时要修改为statement格式,如果使用了row格式,则使用参数--no-check-binlog-format  不检查row格式),另外还要注意:使用这两个工具前提是表必须有主键

示例:

环境,已经搭建好传统复制的主从环境:

192.168.0.32  主库

192.168.0.72  从库

1. 在主从库都授权一个帐号:

mysql > GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'checksums'@'192.168.0.%' IDENTIFIED BY 'xxx';

mysql > flush privileges;

2. 在主库建库建表:

mysql > create database xiaoboluo;

mysql > CREATE TABLE `aa` (

`aa` varchar(1) DEFAULT '',

`bb` varchar(1) DEFAULT NULL,

`id` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. 主库插入测试数据:

mysql > INSERT INTO `aa` VALUES ('1','1',1),('2','2',2),('5','2',5);

4. 在从库检查库、表和数据是否有同步完成,确认无误后开始下面的步骤:

在从库上把id=1的行删掉,插入一行数据,再把id=5的行修改一下:

mysql > delete from xiaoboluo.aa where id=1;

mysql > insert into xiaoboluo.aa values('4','4',4);

mysql > update xiaoboluo.aa set bb=5 where id=5;

5. 到主库执行pt-table-checksum命令:

shell > pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=xiaoboluo.checksums --create-replicate-table --databases=xiaoboluo  -h 192.168.0.38 -P 3306 -u root -pxxx --recursion-method="processlist"

最重要的是看diffs这一列(发现表aa主从数据不一致)

TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE

12-24T12:17:58      0      1        3       1       0   0.010 xiaoboluo.aa

执行结果显示参数意义:

TS            :完成检查的时间。

ERRORS     :检查时候发生错误和警告的数量。

DIFFS        :0表示一致,大于0表示不致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。

ROWS       :表的行数。

CHUNKS    :被划分到表中的块的数目。

SKIPPED    :由于错误或警告或过大,则跳过块的数目。

TIME         :执行的时间。

TABLE       :被检查的表名。

6. 接着执行pt-table-sync命令进行数据同步,同步之前最好先使用该命令的--print命令打印一下看看有些什么数据不一致:

shell > pt-table-sync --replicate=xiaoboluo.checksums --databases=xiaoboluo --charset=utf8 h=192.168.0.38,u=root,p=xxx --print

建议先用: --print 打印出来(这里会打印delete什么数据,replace into什么数据,pt-table-checksum在检测主库有数据,而从库没有的数据的时候,不会显示出来,所以最好这里print一下就可以看到主库多出来的数据),类似如下:

DELETE FROM `xiaoboluo`.`aa` WHERE `id`='4' LIMIT 1 /*percona-toolkit src_db:xiaoboluo src_tbl:aa src_dsn:A=utf8,h=192.168.0.38,p=...,u=root dst_db:xiaoboluo dst_tbl:aa dst_dsn:A=utf8,h=192.168.0.72,p=...,u=root lock:1 transaction:1 changing_src:xiaoboluo.checksums replicate:xiaoboluo.checksums bidirectional:0 pid:29301 user:root host:localhost.localdomain*/;

REPLACE INTO `xiaoboluo`.`aa`(`aa`, `bb`, `id`) VALUES ('1', '1', '1') /*percona-toolkit src_db:xiaoboluo src_tbl:aa src_dsn:A=utf8,h=192.168.0.38,p=...,u=root dst_db:xiaoboluo dst_tbl:aa dst_dsn:A=utf8,h=192.168.0.72,p=...,u=root lock:1 transaction:1 changing_src:xiaoboluo.checksums replicate:xiaoboluo.checksums bidirectional:0 pid:29301 user:root host:localhost.localdomain*/;

REPLACE INTO `xiaoboluo`.`aa`(`aa`, `bb`, `id`) VALUES ('5', '2', '5') /*percona-toolkit src_db:xiaoboluo src_tbl:aa src_dsn:A=utf8,h=192.168.0.38,p=...,u=root dst_db:xiaoboluo dst_tbl:aa dst_dsn:A=utf8,h=192.168.0.72,p=...,u=root lock:1 transaction:1 changing_src:xiaoboluo.checksums replicate:xiaoboluo.checksums bidirectional:0 pid:29301 user:root host:localhost.localdomain*/;

7. 然后在--execute选项执行同步数据:

shell > pt-table-sync --replicate=xiaoboluo.checksums --databases=xiaoboluo --charset=utf8 h=192.168.0.38,u=root,p=xxx --execute

然后在用pt-table-checksum检查下,如果diffs列全部为0则表示主从数据已经一致。

TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE

12-24T12:22:31      0      0        3       1       0   0.271 xiaoboluo.aa

该工具对于从库上多的数据,会在主库上发起delete操作,对于从库上少的数据或者是主从数据中主键一样,但是其他列数据不一样的数据,会在主库上发起replace into操作。注意:都是在主库上操作,从库不操作。那么怎么知道主从数据谁多谁少呢,依据就是checksums表中的校验信息。

pt-table-sync也是使用statement格式记录操作过程中的二进制日志的,操作过程中最好把主从的general_log都打开。这样就能知道在修复过程中,主从库到底做了些什么操作。

使用percona-toolkit校验主从数据的一致性的更多相关文章

  1. 如何校验内存数据的一致性,DynamicExpresso 算是帮上大忙了

    一:背景 1. 讲故事 记的在上一家公司做全内存项目的时候,因为一些关键表会在程序 startup 的时候全量灌入到内存中,但随着时间的推移,内存和数据库的同步偶尔会出现数据差异的情况,伴随着就是运营 ...

  2. mysql 主从 数据不一致

    用pt-table-checksum校验数据一致性 Jun 4th, 2013 主从数据的一致性校验是个头疼的问题,偶尔被业务投诉主从数据不一致,或者几个从库之间的 数据不一致,这会令人沮丧.通常我们 ...

  3. 使用Percona Toolkit解决Mysql主从不同步问题【备忘】

    由于各种原因,mysql主从架构经常会出现数据不一致的情况出现,大致归结为如下几类 1:备库写数据 2:执行non-deterministic query 3:回滚掺杂事务表和非事务表的事务 4:bi ...

  4. Percona Toolkit mysql辅助利器

    1 PT介绍 Percona Toolkit简称pt工具—PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在 ...

  5. MySQL主从数据一致性检验

    MySQL主从数据一致性检验 检查主从数据一致性,我们使用pt-table-checksum ,pt-table-checksum是percona-tools一个工具,用来校验主从库数据是不是一致. ...

  6. Percona Toolkit工具集介绍

    部署mysql工具是一个非常重要的部分,所以工具的可靠性和很好的设计非常重要.percona toolkit是一个有30多个mysql工具的工具箱.兼容mysql,percona server,mar ...

  7. Percona Toolkit工具使用

    Percona Toolkit简称pt工具-PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在线DDL等 下 ...

  8. RDS for MySQL 如何使用 Percona Toolkit

    Percona Toolkit 包含多种用于 MySQL 数据库管理的工具. 下面介绍常用的 pt-online-schema-change  和  pt-archiver 搭配 RDS MySQL ...

  9. Percona Toolkit安装、使用

    percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: l  检查master和slave数据的一致性 l  有效地对记 ...

随机推荐

  1. 打开FileGeoDatabase中要素类

    private IFeatureClass OpenFileGdbFtCls(string fn) { IFeatureClass pftcls = null; IWorkspaceFactory w ...

  2. zju(2)vivi的配置编译和固化

    1.实验目的 熟悉vivi的知识和应用并使用交叉编译平台vivi引导并烧写到目标板. 二.实验内容 1. 在Ubuntu下配置vivi并进行交叉编译: 2. 将编译好的vivi烧写到目标板上. 三.主 ...

  3. 对js中的Date扩展,格式化日期

    /** * 对Date的扩展,将 Date 转化为指定格式的String 月(M).日(d).12小时(h).24小时(H).分(m).秒(s).周(E).季度(q) * 可以用 1-2 个占位符 年 ...

  4. 你应了解的4种JS设计模式

    学习地址: http://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651223556&idx=1&sn=8cd7a2272 ...

  5. 形形色色的下拉菜单 (css3)

    http://www.iteye.com/news/25339

  6. 不正确使用WeakHashMap引起的卡死

    公司的jenkins今天出了一点问题,起来以后,总是处于等待状态,所有的任务无法正常加载.登陆界面也出不了.而且cpu占用率100% 把线程导出来,看到: “Loading job NMS_Patch ...

  7. IOS第八天(3:UITableViewController团购, 点击底部代码调整)

    ****代理者的方法中 // 通知页脚视图调整视图显示状态 [footerView endRefresh]; //发送代理通知的类中 /** 视图控制器刷新完成调用方法 */ - (void)endR ...

  8. Trie树

    一.什么是trie树 1.Trie树 (特例结构树)   Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串( ...

  9. JS写的CRC16校验算法

    var CRC = {}; CRC.CRC16 = function (data) { var len = data.length; if (len > 0) { var crc = 0xFFF ...

  10. 【转】ArcGIS 创建切片缓存方法工具总结

    ArcGIS 创建切片缓存方法工具总结 http://wenku.baidu.com/link?url=Bm8AkmcJBzfiyat9N_Me6vlfSHEDCC_D1qBk5IB4X4CIDeKI ...