精华内容
下载资源
问答
  • 常用的数据校验方法

    千次阅读 2018-06-11 16:26:57
    1.什么是数据校验  通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。 2.最...

    1.什么是数据校验 
    通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。

    2.最简单的检验 
    实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。同时也是效率最低的。

    适用范围:简单的数据量极小的通讯。

    3.奇偶校验Parity Check 
    实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。校验位可以通过数据位异或计算出来。

    根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。 
    校验方法 
    奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数 
    1000110(0)你必须添0这样原来有3个1已经是奇数了所以你添上0之后1的个数还是奇数个。 
    偶校验:就是让原有数据序列中(包括你要加上的一位)1的个数为偶数 
    1000110(1)你就必须加1了这样原来有3个1要想1的个数为偶数就只能添1了 
    范例 
    串行数据在传输过程中,由于干扰可能引起信息的出错,例如,传输字符‘E’,其各位为: 
    0100,0101=45H 
    D7 D0 
    由于干扰,可能使位变为1,(为什么不变0?)这种情况,我们称为出现了“误码”。我们把如何发现传输中的错误,叫“检错”。发现错误后,如何消除错误,叫“纠错”。最简单的检错方法是“奇偶校验”,即在传送字符的各位之外,再传送1位奇/偶校验位。可采用奇校验或偶校验。 
    奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如: 
    1 0110,0101 
    0 0110,0101 
    偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如: 
    1 0100,0101 
    0 0100,0101 
    奇偶校验能够检测出信息传输过程中的部分误码(奇数位误码能检出,偶数位误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。但由于其实现简单,仍得到了广泛使用。有些检错方法,具有自动纠错能力。如循环冗余码(CRC)检错等

    应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。

    4.bcc异或校验法(block check character) 
    实现方法:很多基于串口的通讯都用这种既简单又相当准确的方法。它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常 
    把她附在通讯数据的最后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。 
    校验值计算的代码类似于: 
    unsigned uCRC=0;//校验初始值 
    for(int i=0; i < DataLenth;i++) uCRC^=Data[i];

    适用范围:适用于大多数要求不高的数据通讯。

    应用例子:ic卡接口通讯、很多单片机系统的串口通讯都使用。

    5.crc循环冗余校验(Cyclic Redundancy Check) 
    实现方法:这是利用除法及余数的原理来进行错误检测的.将接收到的码组进行除法运算 
    ,如果除尽,则说明传输无误;如果未除尽,则表明传输出现差错。crc校验 
    具还有自动纠错能力。

    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 
    工作原理 
    循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。 
    对应关系 
    多项式和二进制数有直接对应关系:X的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:X的最高幂次为R,转换成对应的二进制数有R+1位。 
    多项式包括生成多项式G(X)和信息多项式C(X)。 
    如生成多项式为G(X)=X4+X3+X+1, 可转换为二进制数码11011。 
    而发送信息位 101111,可转换为数据多项式为C(X)=X5+X3+X2+X+1。 
    生成多项式 
    是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。 
    在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接收方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。 
    应满足以下条件: 
    A、生成多项式的最高位和最低位必须为1。 
    B、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。 
    C、不同位发生错误时,应该使余数不同。 
    D、对余数继续做除,应使余数循环。 
    校验码位数 
    CRC校验码位数 = 生成多项式位数 - 1。注意有些生成多项式的简记式中将生成多项式的最高位1省略了。 
    生成步骤 
    1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。 
    2、将信息码左移R位,相当于对应的信息多项式C(X)*2R。 
    3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。 
    4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。 
    【例】假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求编码后的报文。 
    解: 
    1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。 
    2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010 000 
    3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或: 
    1010000 
    1011 
    ———–】 
    0001000 
    0001011 
    ———-】 
    0000011 
    得到的余位011,所以最终编码为:1010 011 
    原则 
    若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得 
    V(x)=A(x)g(x)=xRm(x)+r(x); 
    其中: m(x)为K次原始的信息多项式, r(x)为R-1次校验多项式(即CRC校验和), 
    g(x)称为生成多项式: 
    g(x)=g0+g1x1+ g2x2+…+g(R-1)x(R-1)+gRxR 
    发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。 
    生成方法 
    借助于模2除法则,其余数为校验字段。 
    例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1 
    假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001 
    x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000; 
    采用模2除法则: 得余数为: 1010(即校验字段为:1010) 
    发送方:发出的传输字段为: 1 0 1 1 0 0 1 1010 
    信息字段 校验字段 
    接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法) 
    如果能够除尽,则正确, 
    给出余数(1010)的计算步骤: 
    除法没有数学上的含义,而是采用计算机的模二除法,即除数和被除数做异或运算。进行异或运算时除数和被除数最高位对齐,按位异或。 
    10110010000 
    ^11001 
    ————————–】 
    01111010000 
    1111010000 
    ^11001 
    ————————-】 
    0011110000 
    11110000 
    ^11001 
    ————————–】 
    00111000 
    111000 
    ^11001 
    ——————-】 
    001010 
    则四位CRC校验码就为:1010。 
    利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。

    crc检验主要有计算法和查表法两种方法,网上很多实现代码。

    适用范围:CRC-12码通常用来传送6-bit字符串;CRC-16及CRC-CCITT码则用是来传送 
    8-bit字符。CRC-32:硬盘数据,网络传输等

    应用例子:rar,以太网卡芯片、MPEG解码芯片中

    6.md5校验和数字签名 
    实现方法:主要有md5和des算法。

    适用范围:数据比较大或要求比较高的场合。如md5用于大量数据、文件校验,des用于保 
    密数据的校验(数字签名)等等。

    应用例子:文件校验、银行系统的交易数据

    7.海明码校验 
    将有效信息按某种规律分成若干组,每组安排一个校验位,做奇偶测试,就能提供多位检错信息,以指出最大可能是哪位出错,从而将其纠正。实质上,海明校验是一种多重校验。 
    假设为k个数据位设置r个校验位,则校验位能表示2^r个状态,可用其中的一个状态指出 “没有发生错误”,用其余的2 ^r -1个状态指出有错误发生在某一位,包括k个数据位和r个校验位,因此校验位的位数应满足如下关系: 
    2^r ≥ k + r + 1 (2.7) 
    如要能检出与自动校正一位错,并能同时发现哪位错,此时校验位的位数r和数据位的位数k应满足下述关系: 
    2^r-1 ≥ k + r (2.8) 
    按上述不等式,可计算出数据位k与校验位r的对应关系,如表2.2所示。 
    表2.2 
    k值 最小r值 
    2~4 3 
    5~11 4 
    12~26 5 
    27~57 6 
    58~120 7 
    分组原则 
    编辑 
    在海明码中, 位号数(1、2、3、……、n)为2的权值的那些位,即: 
    1(2^0)、2(2^1)、4(2^2)、8(2^3)、…2^(r-1)位,作为奇偶校验位,并记作: P1、P2、P3 、P4、…Pr,余下各位则为有效信息位。例如: N=11(海明码位数)K=7(数据位数)r=4(校验位) ,相应海明码可表示位号为: 1, 2, 3, 4 ,5 ,6, 7, 8, 9 ,10 ,11,校验位P占第1,2,4,8位,其他位为有效信息位,海明码中的校验位分别标示为P1,P2,P3,P4… Pr ,并被信息位中的一至若干位所校验,其规律是:第i位,由校验位位号之和等于i的那些校验位所校验,如:海明码的位号为3,它被P1P2(位号分别为1,2)所校验,海明码的位号为5,它被P1P3(位号分别为1,4)所校验。归并起来: 形成了4个小组,每个小组一个校验位,校验位的取值,仍采用奇偶校验方式确定。 
    设计海明码编码的关键技术,是合理地把每个数据位分配到r个校验组中,以确保能发现码字中任何一位出错;若要实现纠错,还要求能指出是哪一位出错,对出错位求反则得到该位的正确值。例如,当数据位为3位(用D3 D2 D1表示)时,检验位应为4位(用P4 P3 P2 P1表示)。可通过表2.3表示的关系,完成把每个数据位划分在形成不同校验位的偶校验值的逻辑表达式中。 
    表2.3 校验位与数据位的对应关系 
    在P1、P2、P3、P4竖列相应行分别填1, 
    在该4列的低3横行其它位置分别填0, 
    在最顶横行的每个尚空位置都分别填1。 
    若只看低3横行,右4竖列的3个bit的组合值分别为十进制的1、2、4、0,则分配 D1 D2 D3列的组合值为3 5 6,保证低3横行各竖列的编码值各不相同。 
    表中D3 D2 D1为三位数据位,P4 P3 P2 P1为四位校验位。其中低三位中的每一个校验位P3 P2 P1的值,都是用三个数据位中不同的几位通过偶校验运算规则计算出来的。其对应关系是:对Pi(i的取值为1~3),总是用处在Pi取值为1的行中的、用1标记出来的数据位计算该Pi的值。最高一个校验位P4,被称为总校验位,它的值,是通过对全部三个数据位和其它全部校验位(不含P4本身)执行偶校验计算求得的。 
    形成各校验位的值的过程叫做编码,按刚说明的规则,4个校验位所用的编码方程为: 
    P4 = D3 D2 D1 P3 P2 P1 
    P3 = D3 D2 
    P2 = D3 D1 
    P1 = D2 D1 
    由多个数据位和多个校验位组成的一个码字,将作为一个数据单位处理,例如被写入内存或被传送走。之后,在执行内存读操作或在数据接收端,则可以对得到的码字,通过偶校验来检查其合法性,通常称该操作过程为译码,所用的译码方程为: 
    S4 = P4 D3 D2 D1 P3 P2 P1 
    S3 = P3 D3 D2 
    S2 = P2 D3 D1 
    S1 = P1 D2 D1 
    对应关系 
    编辑 
    译码方程和编码方程的对应关系很简单。译码方程,是用一个校验码和形成这个校验码的编码方程执行异或,实际上是又一次执行偶校验运算。通过检查四个S的结果,可以实现检错纠错的的目的。实际情况是,当译码求出来的S4、S3、S2、S1的得值与表2.3中的那一列的值相同,就说明是哪一位出错;故人们又称表2.3为出错模式表。若出错的是数据位,对其求反则实现纠错;若出错的是校验位则不必理睬。举例如下: 
    任何一位(含数据位、校验位)均不错,则四个S都应为0值; 
    任何单独一位数据位出错,四个S中会有三个为1;如D3错,则S4 S3 S2 S1为1110。 
    若单独一位校验位出错,四个S中会有一个或两个为1;如P1错,S4 S3 S2 S1为1001,如P4错,S4 S3 S2 S1为1000。 
    任何两位(含数据位、校验位)同时出错,S4一定为0,而另外三个S位一定不全为0,此时只知道是两位同时出错,但不能确定是哪两位出错,故已无法纠错。如D1、 P2出错,会使S4 S3 S2 S1为0001。请注意,S4的作用在于区分是奇数位出错还是偶数位出错,S4为1是奇数位错,为0是无错或偶数位错。这不仅为发现两位错所必需,也是为确保能发现并改正一位错所必需的。若不设置S4,某种两位出错对几个S的影响与单独另一位出错可能是一样的(不必花费精力推敲),此时若不加以区分,简单地按一位出错自动完成纠错处理反而会帮倒忙

                </div>
    
    展开全文
  • 本文分享了MySQL复制数据一致校验和修复的详细步骤及其自动化实现思路和方法,对MySQL复制架构运维中该项工作的实施及其自动化具有较好的借鉴意义。

    微信扫一扫关注我的公众号或者搜索添加“MySQL技术的学习分享”,可以更快速更实时地获取我的最新文章。


    1.    引言

    MySQL主从复制”技术在互联网行业常见高可用架构中应用非常广泛,例如常见的一主一从复制架构、keepalivedMySQL双主(主从)复制架构、MHA+一主两从复制架构等等都应用了MySQL主从复制技术。但因主从复制是基于binlog的逻辑复制,难免出现复制数据不一致的风险,这个风险不但会引起用户数据访问前后不一致的风险,而且会导致后续复制出现10321062错误进而引起复制架构停滞的隐患,为了及时发现并解决这个问题,我们需要定期或不定期地开展主从复制数据一致性的校验和修复工作,那么如何实现这项工作呢?又如何实现这项工作的自动化呢?我们来探讨这些问题。

     

    2.    数据一致性校验和修复方法

    为了实现主从复制数据一致性校验和修复,我们首先推荐两个热门工具,分别是percona公司的 pt-table-checksumpt-table-sync,前者用来实现主从复制数据一致性的校验,后者实现数据修复,将数据修复到一致。


    2.1        工作原理

            pt-table-checksum通过SQL在主库执行数据块的校验,再将相同的语句传送到从库,并在从库上计算数据块的校验,最后将主从库相同块的校验值进行对比,辨别主从数据是否不一致。

    pt-table-sync用来修复主从复制数据的不一致,使得它们修复到最终一致,也可以实现多个实例或者是应用双写或多写的多个不相关的数据库实例修复到一致。同时它还内部集成了pt-table-checksum的校验功能,可以一边校验一边修复,也可以基于pt-table-checksum的计算结果来进行修复。

     

    2.2        下载方法

         这两个工具均包含在percona-toolkit里,线上下载地址:  https://www.percona.com/downloads/percona-toolkit/2.2.2/

         在设备上直接下载的指令如下,下载后解压使用:wget https://www.percona.com/downloads/percona-toolkit/2.2.2/percona-toolkit-2.2.2.tar.gz

     

    2.3        校验和修复方法

    1)在主库创建校验账号

    GRANTUPDATE,INSERT,DELETE,SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'hangxing'@'MasterIP'identified by 'PASSWORD';

    GRANTALL ON test.* TO 'hangxing'@'MasterIP' IDENTIFIED BY 'PASSWORD';

    2)在主库创建校验信息表

    CREATETABLE IF NOT EXISTS checksums (

    db char(64)NOT NULL,

    tblchar(64) NOT NULL,

    chunk intNOT NULL,

    chunk_timefloat NULL,

    chunk_indexvarchar(200) NULL,

    lower_boundarytext NULL,

    upper_boundarytext NULL,

    this_crcchar(40) NOT NULL,

    this_cntint NOT NULL,

    master_crcchar(40) NULL,

    master_cntint NULL,

    tstimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    PRIMARY KEY(db, tbl, chunk),

    INDEXts_db_tbl (ts, db, tbl)

    )ENGINE=InnoDB;

    3)判断主键

    若无主键做校验和修复对性能影响非常重,数据校验和修复最重要的约束便是主健,无主键或唯一索引,将导致修复不成功。

    主键判断语句:

    SELECTDISTINCT CONCAT(t.table_schema,'.',t.table_name) astbl,t.engine,IF(ISNULL(c.constraint_name),'NOPK','') AS nopk,IF(s.index_type ='FULLTEXT','FULLTEXT','') as ftidx,IF(s.index_type = 'SPATIAL','SPATIAL','') asgisidx FROM information_schema.tables AS t LEFT JOINinformation_schema.key_column_usage AS c ON (t.table_schema =c.constraint_schema AND t.table_name = c.table_name AND c.constraint_name ='PRIMARY') LEFT JOIN information_schema.statistics AS s ON (t.table_schema =s.table_schema AND t.table_name = s.table_name AND s.index_type IN('FULLTEXT','SPATIAL')) WHERE t.table_schema NOT IN('information_schema','performance_schema','mysql') AND t.table_type = 'BASETABLE' AND (t.engine <> 'InnoDB' OR c.constraint_name IS NULL ORs.index_type IN ('FULLTEXT','SPATIAL')) ORDER BY t.table_schema,t.table_name;

    4)主从数据校验

           主从数据校验使用pt-table-checksum实现,要在主库上执行,执行校验通过参数控制校验全库全表还是只校验核心表。

    校验指令举例:

    ./pt-table-checksum--nocheck-binlog-format --nocheck-plan --nocheck-replication-filters--replicate=test.checksums  --databases=db1--tables=tb1 -h 192.168.XXX.XX -P 3306-u'hangxing' -p'PASSOWRD' --recursion-method="processlist"

    解析: 

    --no-check-binlog-format 不检查复制的binlog模式。

           --nocheck-replication-filters 不检查复制过滤器,建议启用。

    --replicate=test.checksums 检查结果写入test库的checksums表里。

    --databases=db1  --tables=tb1 校验db1库里的tb1表,若无参数则校验全库全表。

    -h 192.168.XXX.XX -P 3306 主库IP地址和3306端口。

    -u'hangxing' -p'PASSOWRD' 校验账号密码。

    --recursion-method="processlist" processlist的方法来发现从库。

          执行后的输出结果:

    TS   ERRORS      DIFFS      ROWS  CHUNKS  SKIPPED   TIME  TABLE

    03-23T15:29:17    0     1    30000       1       0  1.270 testhx1.testhx1

    解析:

    TS            :完成检查的时间。 

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

    DIFFS        0表示一致,大于0表示不一致。主要看这一列有无不一致数据。

    ROWS       :表的行数。 

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

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

    TIME         :执行的时间。 

    TABLE       :被检查的表名。 

        上述输出关键看DIFFS列,结果为0说明数据一致,无需进行数据修复,如果不为0则需要继续开展数据一致性修复工作。上述语句执行后也会将详细的内容会写入test库的checksums表中,可以查看这个库表得到详细的数据校验信息,此表中信息内容格式举例如下:  

            主库的test.checksums中输出this_crcmaster_crc,无不一致。

    mysql> select * fromtest.checksums;

    +---------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+

    | db      | tbl    | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc| master_cnt | ts                  |

    +---------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+

    | testhx1 | testhx1 |     1 |  0.003661 | NULL        | NULL           | NULL           | cac6c46f|        4 | cac6c46f   |         4 | 2016-03-23 15:29:16 |

    +---------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+

    1 row in set (0.00 sec)

    从库的test.checksums中输出this_crcmaster_crc,不一致。

    mysql>select * from checksums;

    +---------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+

    |db      | tbl     | chunk | chunk_time | chunk_index |lower_boundary | upper_boundary | this_crc |this_cnt | master_crc | master_cnt | ts                  |

    +---------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+

    |testhx1 | testhx1 |     1 |   0.003661 | NULL        | NULL           | NULL           | 7c2e5f75|        5 | cac6c46f  |          4 | 2016-03-23 15:29:16 |

    +---------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+

    1row in set (0.00 sec)

     

    5)主从数据修复

    pt-table-checksum工具确定确实存在数据不一致的情况下开始修复数据,数据修复使用工具pt-table-sync,内带校验功能,但前提是修复的表必须要有主键,这个工具也要在主库上执行。

    方法1:语句量大的情况下将修复的语句导入到sql文件中,再直接导入执行

    在主库用pt-table-sync打印出修复不一致数据的SQL,后将修复语句在从库执行。

    举例:

    pt-table-sync --print--sync-to-master h='SlaveIP',P=3306,u=hangxing,p='PASSWORD' --databases=db1--tables=tb1 > /tmp/repair.sql

    方法2:语句量不大的情况下,将修复的语句print出来,再execute

    举例:

    打印数据修复语句

    pt-table-sync--print --sync-to-master h='SlaveIP',P=3306,u=hangxing,p=' PASSWORD '--databases=testhx1 --tables=testhx1

    DELETE FROM`testhx1`.`testhx1` WHERE `id`='11' LIMIT 1 /*percona-toolkit src_db:testhx1src_tbl:testhx1 src_dsn:P=3306,h=’MasterIP’,p=...,u=checksums dst_db:testhx1dst_tbl:testhx1 dst_dsn:P=3306,h='SlaveIP',p=...,u=checksums lock:1transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:24745 user:hangxinghost:XXXXXXXXXX*/;

    REPLACEINTO `testhx1`.`testhx1`(`name`, `age`, `id`) VALUES ('bobby', '6', '7')/*percona-toolkit src_db:testhx1 src_tbl:testhx1 src_dsn:P=3306,h=’MasterIP’,p=...,u=hangxingdst_db:testhx1 dst_tbl:testhx1 dst_dsn:P=3306,h=’SlaveIP’,p=...,u=hangxinglock:1 transaction:1 changing_src:1 replicate:0 bidirectional:0 pid:24745user:root host: XXXXXXXXXX */;

    REPLACEINTO `testhx1`.`testhx1`(`name`, `age`, `id`) VALUES ('lily', '5', '9')/*percona-toolkit src_db:testhx1 src_tbl:testhx1 src_dsn:P=3306,h=’MasterIP’,p=...,u=hangxing  dst_db:testhx1 dst_tbl:testhx1dst_dsn:P=3306,h=’SlaveIP’,p=...,u=hangxing lock:1 transaction:1 changing_src:1replicate:0 bidirectional:0 pid:24745 user:root host: XXXXXXXXXX */;

    执行数据修复语句

    pt-table-sync--execute --sync-to-master h='SlaveIP',P=3306,u=hangxing,p='PASSWORD'--databases=testhx1 --tables=testhx1

    6)再次校验

       上述修复完成之后,需要再次执行一次数据校验,确保数据成功修复,校验方法同(4)主从数据校验。


    2.4 值得注意的点

    1)校验修复工作每月定期开展;

    2)主从复制架构在割接操作前后均需执行数据校验和修复工作;

    3)主从复制出现故障后要开展数据校验和修复工作;

    4)校验修复需在业务低谷期进行,CPU利用率超过60%时不建议做数据校验和修复;

    5)校验和修复必须在主库进行;

    6)数据库的表要有主键,否则校验效率极差,并且修复不成功。

     

    3.数据一致性校验和修复的自动化实现

    理解上述方法后,我们可以顺利完成主从复制数据一致性的校验和修复工作,但是这项工作在MySQL主从复制架构维护中开展频率较高,包括定期和各种不定期的情况,每次都手工开展耗时耗力,并且容易出现人为错误及隐患,因此,我们考虑将这项工作通过脚本实现自动化。


    3.1前提准备

    创建校验账号,创建校验结果输出表,配置两台主机的ssh免密码登录。


    3.2自动化实现

    (1)部署自动化脚本和定时任务

    理解数据一致性校验和修复的全部原理和详细步骤,将其转化为多个自动化脚本,分别部署在主从库上,每月定期执行可通过在主库制定crontab定时任务调用主从库脚本实现,不定期执行可通过手动调用主从库部署的自动化脚本来实现。

    2)自动化脚本实现步骤

    a.DB相关信息赋予对应参数,如账户密码、IP、端口、常用指令等等

    dbuser=XXXX

    dbpasswd="XXXXX"

    port=3306

    mysql_commend="mysql-u${dbuser} -p${dbpasswd} -P${port}"

    master_ip=XXXXX

    slave_ip=XXXXX

    password="XXXXX"

    date=`date+%Y%m%d`

    logfile="XXXXX"

    hostname=`XXXXX`

    b.检查ssh免密码登录是否成功;

    ssh_status=`XXXXX`

        if [ $ssh_status != $hostname ]; then

        echo -e "\nthe ssh should berepair" >$logfile

        exit

    else

        echo -e "\nthe ssh is ok">$logfile

    fi

    c.脚本实现准备工作:包括账号密码的创建、建立校验结果输出表,代码可参见第2小节;

    d.将主库的脚本执行校验和主键判断写成联合SQL语句,实现剔除无主键表的所有表的自动数据校验,并将结果存入所建表中;

    selectXXXXX NOT IN XXXXX

    e.从库部署检查校验结果输出表的脚本,主库执行d后自动登录从库调用这个脚本,实现对从库上输出表中校验字段的对比如master_crc this_crc,找到数据不一致的表,并且通过执行调用修复工具的指令实现不一致数据修复语句的print

    master_cnt<> this_cnt OR master_crc <> this_crc OR isnull(master_crc)<> isnull(this_crc))

    fprint结果自动存储从库的某个路径文件下;

    intooutfile '/tmp/execute_sql.sh'

    g.主库自动登录从库scp获取语句修复文件;

    scp/tmp/execute_sql.sh root@$master_ip:/tmp/execute_sql.sh

    h.主库上自动执行修复语句;

    sh/tmp/execute_sql.sh

           i.清理掉各个中间文件,中间表等

           上述内容记录了该项工作的自动化实现思路及部分实现要点,自动化便是通过在这个思路的基础上编写主从库部署的脚本来实现,目前已亲测成功,已实现自动化的数据校验和修复,说明上述思路正确。


    4.结语

        本文分享了MySQL复制数据一致性校验和修复的详细步骤及其自动化实现思路和方法,对MySQL复制架构运维中该项工作的实施及其自动化具有较好的借鉴意义。


    展开全文
  • 数据一致校验

    千次阅读 2019-05-28 17:10:01
  • 基于XML的自动化异构系统数据一致校验方法.rar
  • 基于XML的自动化异构系统数据一致校验方法.pdf
  • 常见的数据校验方法

    千次阅读 2019-08-09 18:00:54
    实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来传送奇/偶校验位来检验错误。 奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如: 1 0110,0101 0 0110,0001 偶校验...

    校验,是为保护数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。当接收方用同样的算法再算一次校验值,如果两次校验值一样,表示数据完整。

     1. 奇偶校验

    实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来传送奇/偶校验位来检验错误。

    奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:

    1 0110,0101

    0 0110,0001

    偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:

    1 0100,0101

    0 0100,0001

     2.  bcc异或校验法

    实现方法:将所有数据都和一个指定的初始值(通常是0)异或一次,所得结果为校验值。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。 

    特点:应用于很多基于串口的通讯方法。

    3.md5校验和数字签名

    实现方法:主要有md5和des算法。 

    适用范围:数据比较大或要求比较高的场合。如md5用于大量数据、文件校验,des用于保密数据的校验(数字签名)等等。 

    应用例子:文件校验、银行系统的交易数据 

    如客户往我们数据中心同步一个文件,该文件使用MD5校验,那么客户在发送文件的同时会再发一个存有校验码的文件,我们拿到该文件后做MD5运算,得到的计算结果与客户发送的校验码相比较,如果一致则认为客户发送的文件没有出错,否则认为文件出错需要重新发送。
    4. CRC算法

    CRC原理介绍(通俗讲) 
    1、发送端 
    1.1、在发送端先将数据分组,每组k个数据。假定要传送的数据是M。 
    1.2、在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位。 
    虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值得的。

    1.3、冗余码可以用下面的方法得出: 
    3.1、用二进制模2运算进行2^n*M(相当于M左移n位)的运算。意思就是在M后面补n个0。现在M就变成了k+n位。 
    1.3.2、用M除以收发双方事先商定的长度为n+1的除数P。 
    1.3.3、得到的余数R,这个R就是FCS(帧检验序列)。将这个FCS序列加到M上然后发出去。

    2、接受端 
    2.1、在接受端把接受到的数据以帧为单位进行CRC校验 
    2.2、把收到的每一个帧都除以同样的除数P,然后检查余数R。 
    2.3、如果余数R为0,如果在传输过程中没有差错。 
    2.4、如果出现误码,那么余数R为零的概率是非常小的。

    总结:在接收端对接收到的每一帧进行CRC检验后,若余数R为,则表示这个帧没有错,就接受。若R不为0,则判定这个帧出错,就丢弃。

    标准CRC生成多项式如下表:

      名称       生成多项式             简记式*  标准引用
       CRC-4      x4+x+1                 3         ITU G.704
       CRC-8      x8+x5+x4+1             0x31                   
       CRC-8      x8+x2+x1+1             0x07                   
       CRC-8      x8+x6+x4+x3+x2+x1       0x5E
       CRC-12     x12+x11+x3+x+1          80F
       CRC-16     x16+x15+x2+1           8005      IBM SDLC
       CRC16-CCITTx16+x12+x5+1           1021      ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
       CRC-32      x32+x26+x23+...+x2+x+104C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
       CRC-32c     x32+x28+x27+...+x8+x6+1 1EDC6F41SCTP
                                 
       生成多项式的最高位固定的1,故在简记式中忽略最高位1了,如0x1021实际是0x11021。

     可以参考这篇博客:https://blog.csdn.net/xinyuan510214/article/details/80104356

     

     

    展开全文
  • 主从数据一致对DBA来说是一个比较头疼的事情,刚接触MySQL时,遇到这种问题我一般采用重新还原备库的方式恢复数据,这对我来说是个很痛苦的过程。今天就来介绍两款pt工具,通过这...
  • mysql 数据一致校验

    2017-11-12 13:59:00
    工作上需要把一个从库提升为主库,但对从库和主库的数据一致性不能保证一样,所以就利用 pt-table-checksum 工作来检查主从的一致性,操作前需要注意的事项: (1)在有些情况下,recursion-method如果不设会报错:...
  • BeeDI提供任意数据库之间(Oracle、SQL Server、MySQL、PostgreSQL、Elasticsearch、Cassandra、MongoDB、Solr等)表的数据比对功能,具体特点如下: 支持异构表的比对(不同表名,目标表字段可多于源表). 支持无...
  • 几种常用的数据校验方式

    千次阅读 2018-03-22 15:20:44
    常用的几种数据校验方式有奇偶校验、CRC校验、LRC校验、格雷码校验、和校验、异或校验等。 一、奇偶校验 1. 定义 根据被传输的一组二进制代码中“1”的个数是奇数或偶数来进行校验。 使用:通常专门设置...
  • 本文主要阐述数据校验过程设计,供相关人员借鉴。 数据一致性校验最核心内容项 校验手段 根据常见数据存储类型,主要完成对象级记录一致性校验,字段级数值、时间、字符类型的数据一致性校验,即常规提到的表级...
  • NULL 博文链接:https://skycb.iteye.com/blog/2363483
  • 数据校验方法

    千次阅读 2016-11-05 23:37:48
    1.什么是数据校验  通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。 2.最简单的...
  • 常用校验码(奇偶校验码、海明校验码、CRC校验码...  计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的,误码...
  • 数据校验方法(有待整理)

    千次阅读 2016-11-05 20:53:12
    1.什么是数据校验 通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。 2.最简单的检验 ...
  • OGG同步的人工数据一致校验(Oracle到Oracle)
  • 显示结果:原本相同的汉字字符,数据校验认为不一致。 原因分析:对于主库而已,由于建立连接的字符集为UTF8,则返回的汉字字符编码为UTF8格式;对于备库而言则是GBK格式,而程序中通过字符串比较函数strcasecmp进行...
  • linux中的数据校验方法

    千次阅读 2016-11-06 22:11:03
    1.什么是数据校验  通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。 2.最简单的...
  • 何谓端到端的数据校验?是指应用层在写入数据时,在经过每个数据模块时,都计算并增加一个校验和信息,并将这些校验和信息和数据块一起发送至磁盘。磁盘在接收到数据包之后,会重新校验信息,并和接收到的校验信息做...
  • 数据校验--BCC校验

    千次阅读 2018-12-26 13:45:14
    BCC(Block Check Character/信息组校验码)即异或校验法 ...它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把它附在通讯数据的最后一起发送出去。接收方收到数据后自己也计...
  • 数据校验的六种方式

    万次阅读 2016-07-18 10:23:02
    数据校验是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,说明数据是完整的。
  • Struts2数据校验功能实现

    千次阅读 2018-01-09 16:27:34
    前言数据校验一般是校验表单项的内容。 而验证的主要通过: 前台验证:主要是通过JS验证数据是否合法! 后台验证:通过后台java代码进行验证! 那么,本文主要介绍后端Struts校验的实现。 回顾之前的数据验证,...
  • 此篇文章主要选取关键性指标,数据校验数据源Hive和目标ES内的数据是否一致; 因为你不知道将Hive的数据导入到了ElasticSearch后,数据量是否准确,所以需要钉钉报警校验ElasticSearch和Hive数据仓库内的数据质量,...
  • 关于前后端数据校验

    千次阅读 2019-03-01 16:13:29
    必须在后端校验的 唯一性验证,验证码,敏感词,出错概率高的要做异步校验。 后端校验可以防止接口被私自调用导致破坏数据库结构;避免有人模拟浏览器行为直接给服务器发请求。 有必要在前端校验的 必填项、(邮箱...
  • 各路大神当然也会注意到这个问题,所以在“元编程”(见JSR250与资源控制)提出之后相续提交了JSR-303、JSR-349以及JSR-380来完善使用注解进行数据校验的机制,这三个JSR也被称为Bean Validati...
  • 对于数据库来说,关系型数据库对于保证数据完整性和一致性方面表现是最好的! 数据的完整性 完整性分类 具体描述 如何保证 实体完整性 每个实体都是独一无二的 主键 / 唯一索引(唯一约束) 参照完整性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 165,203
精华内容 66,081
关键字:

数据校验一致方法