复制数据一致性校验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复制数据一致性校验相关的知识,希望对你有一定的参考价值。

复制数据一致性校验

借鉴:https://segmentfault.com/a/1190000004309169

mysql学习:http://www.itdks.com/dakashuo/playback/267


怎么保证数据复制一致


半同步(5.7 loss zero replication)


异步类的复制:

1、要安装规范来

2、要敏锐的观察力

3、对于异常切换要有数据验证机制(使用GTID)


记账类数据:对比工具




pt-table-checksum使用

percona-tools里的一个工具,用来校验主从数据是否一致。

percona-xtradb-cluster


(1)pt-table-checksum工作原理分析:

master/salve打开general_log ;分析后要关闭


show processlist;

set global genernal_log=1;打开

观察后

。。。。

set global genernal_log=0;关闭



(2)环境

master:node1 3306

slave: node2 3306

GTID


pt-table-checksum --help

官方参照文档:perldoc /usr/bin/pt-table-checksum

pt-table-checksum输出格式:

TS ERRORS  DIFFS  ROWS  CHUNKS SKIPPED    TIME TABLE

10-20T08:36:50      0      0   200       1       0   0.005 db1.tbl1

10-20T08:36:50      0      0   603       7       0   0.035 db1.tbl2

10-20T08:36:50      0      0    16       1       0   0.003 db2.tbl3

10-20T08:36:50      0      0   600       6       0   0.024 db2.tbl4


TS:去掉年的时间

ERRORS:发生错误的次数

DIFFS:发了几个chunk里的数据不一致(默认1000条记录)

ROWS:表里的总长度

CHUNKS:表拆分了多少份来对比

SKIPPED:发生错误跳过的

TIME:检查占用的时间

TABLE:对应的表名


(3)基本使用:主库执行(#主库和从库的端口号要一致)

pt-table-checksum --no-check-binlog-format --replicate=db1.checksums -h 192.168.0.100 -P 3306 -u repl -p repl4slave  --recursion-method="processlist"


#pt-table-checksum  --replicate=db1.checksums -h 192.168.0.100 -P 3306 -u repl -p repl4slave --recursion-method="processlist"

#报错error


#只检查test这个库

pt-table-checksum --no-check-binlog-format --replicate=db1.checksums -h 192.168.0.100 -P 3306 -u repl -p repl4slave --databases=test --recursion-method="processlist"


#检查test,test2这个库,逗号分开

pt-table-checksum --no-check-binlog-format --replicate=db1.checksums -h 192.168.0.100 -P 3306 -u repl -p repl4slave --databases=test,test2 --recursion-method="processlist"


具体用法可以grep来过滤查看命令

pt-table-checksum --help | grep ignore


###显示不一致的用--replicate-check-only

pt-table-checksum --no-check-binlog-format --replicate=db1.checksums -h 192.168.0.100 -P 3306 -u repl -p repl4slave --ignore-databases=mysql --replicate-check-only  --recursion-method="processlist"

pt-table-checksum --no-check-binlog-format --replicate=db1.checksums -h 192.168.0.100 -P 3306 -u repl -p repl4slave --databases=wu --replicate-check-only  --recursion-method="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


DSN:  "h=replica_host,u=repl_user,p=repl_pass".

 


(4)pt-table-sync使用


看一下:

pt-table-sync  --replicate=db1.checksums h=192.168.0.100,u=repl,p=repl4slave --print  


修复数据:

pt-table-sync  --replicate=db1.checksums h=192.168.0.100,u=repl,p=repl4slave --execute


在看一下数据是否一致

pt-table-checksum --no-check-binlog-format --replicate=db1.checksums -h 192.168.0.100 -P 3306 -u repl -p repl4slave --ignore-databases=mysql --replicate-check-only  --recursion-method="processlist"





(5)备注

#############################################################################################################

CREATE DATABASE IF NOT EXISTS db1;

CREATE TABLE IF NOT EXISTS db1.checksums (

    db CHAR(64) NOT NULL,

    tbl CHAR(64) NOT NULL,

    chunk INT NOT NULL,

    chunk_time FLOAT NULL,

    chunk_index VARCHAR(200) NULL,

    lower_boundary TEXT NULL,

    upper_boundary TEXT NULL,

    this_crc CHAR(40) NOT NULL,

    this_cnt INT NOT NULL,

    master_crc CHAR(40) NULL,

    master_cnt INT NULL,

    ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    PRIMARY KEY (db,tbl,chunk),

    INDEX ts_db_tbl(ts,db,tbl)

) ENGINE=InnoDB;


授权

GRANT ALL PRIVILEGES on *.*  to  ‘repl‘@‘192.168.0.%‘ ; 

GRANT SELECT,LOCK TABLES,PROCESS,SUPER on *.* to ‘repl‘@‘192.168.0.%‘ ; 


telnet 192.168.0.101 3306


CREATE TABLE `t1` (

  `uid` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(32) DEFAULT NULL,

  PRIMARY KEY (`uid`)

)


本文出自 “梁小明的博客” 博客,请务必保留此出处http://7038006.blog.51cto.com/7028006/1893631

以上是关于复制数据一致性校验的主要内容,如果未能解决你的问题,请参考以下文章

使用percona-toolkit校验主从数据的一致性

基于pt-table-checksum和pt-table-sync实现MySQL主从数据一致性校验

分布式系统基本概念(一致性数据分布复制策略分布式协议)

MySQL主从同步校验与重新同步

Ceph 集群 scrub 设置策略(数据一致性校验)

复制错误跳过