暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

运维日记丨MySQL“断档”:如何快速实现“增量”同步?

新运维新数据 2022-10-15
586

各位新朋友~记得先点蓝字关注我哦~

场  景 

前不久客户的主从架构出现了报错,客户自行修复之后,主从恢复了正常,但是从库查询数据时,发现与主库数据不一致,有部分数据丢失,如此一来,这个从库就是不合格的。那怎么修复数据呢,一种直接的方式就是重建从库,但是这样不是一个很好的方案。还有一种方案是使用percona-toolkit工具中pt-table-sync组件来修复。

本文主要以本案例恢复去介绍percona-toolkit工具检查主从数据一致性以及数据恢复的相关功能。


percona-toolkit工具

percona-toolkit工具包含多种组件,这次主要介绍是pt-table-checksum和pt-table-sync两个组件。

pt-table-checksum用于校验主从数据的一致性,其原理是在主库上运行,对同步的表进行checksum,记录下来,然后对比主从中各个表的checksum是否一致,从而判断数据是否一致。

而pt-table-sync用于同步MySQL表之间的数据,它可以同步单个表,也可以同步整个库,但是不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。

其次该组件需要注意的是:

  • 根据测试,需要一个既能登录主库,也能登录从库的账号
  • 只能指定一个host,必须为主库的IP
  • 在检查时会向表加S锁
  • 如果master和slave的binlog日志不是STATEMENT格式,要用--no-check-binlog-format选项
  • 运行之前需要从库的同步IO和SQL进程是YES状态
  • 表要有主键索引或唯一键索引


恢复数据案例

1、安装pt-table-checksum和pt-table-sync

首先安装很常规,其实就是下载解压,基本的安装。
    需要的依赖包
    shell> yum -y install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL perl-Digest-MD5
    shell> tar zxvf percona-toolkit.tar.gz
    shell> cd percona-toolkit-3.3.1
    shell> perl Makefile.PL
    shell> make && make install
    shell> vi root/.bash_profile
    PATH=$PATH:/percona-toolkit-3.3.1/bin
    shell> source root/.bash_profile


    2、创建检查用户

    需要在主库创建一个临时作为检查同步的用户。
      shell> create user 'check'@'%' identified by 'check';
      shell> grant SELECT,PROCESS, SUPER, REPLICATION SLAVE,Replication client ON *.* TO 'check'@'%';
      赋予testdb测试库的所有权限,便于后面检查内容写入该库
      shell> grant all on testdb.* to 'check_user'@'%';


      3、主从数据一致性检测

      由于本次案例的数据库端口是在3307,故而在本案例中我们采取的是指定dns监测从库。
        创建dns库
        mysql> CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );
        mysql> INSERT INTO dsns (parent_id,dsn) values(1, "h=192.168.26.121,u=check,p=check,P=3307");
        shell> pt-table-checksum --nocheck-binlog-format --nocheck-replication-filters --replicate=testdb.checksums --databases=testdb --host=192.168.26.120 --port=3307 --user=check --password=check --recursion-method=dsn=h=192.168.26.121,D=dns,t=dsns
        TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
        07-05T15:44:38 0 1 256 5 1 0 0.035 testdb.tb1
        07-05T15:44:38 0 0 3 0 1 0 0.028 testdb.tb2

        结论:testdb.tb1 的 DIFFS 为 1,主从有5行数据不一致。


        检查结果解释:
        TS工具完成表格校验和时的时间戳(不含年份)

        ERRORS

        对表检查时发生的错误和警告数。

        DIFFS

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

        ROWS

        从表中选择并进行校验和的行数。如果使用–where选项,它可能与表中的行数不同。

        DIFF_ROWS

        每个块的最大差异数。如果一个块有 2 个不同的行,而另一个块有 3 个不同的行,则该值为 3。

        CHUNKS

        表被划分成的块数

        SKIPPED

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

        TIME

        执行的时间

        TABLE

        检查的数据库和表。


        4、pt-table-sync主从一致性恢复

          shell>  pt-table-sync --replicate=testdb.checksums --sync-to-master h=192.168.26.121,u=check,p=check,P=3307 --print --execute
          REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('1', '1') *percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;
          REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('2', '2') *percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;
          REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('3', '3') *percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;
          REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('4', '4') *percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;
          REPLACE INTO `testdb`.`tb1`(`id`, `a`) VALUES ('5', '5') /*percona-toolkit src_db:testdb src_tbl:tb1 src_dsn:P=3307,h=192.168.26.120,p=...,u=check dst_db:testdb dst_tbl:tb1 dst_dsn:P=3307,h=192.168.26.121,p=...,u=check lock:1 transaction:1 changing_src:testdb.checksums replicate:testdb.checksums bidirectional:0 pid:54011 user:root host:localhost.localdomain*/;

          结论:可以从打印结果中看出来数据已经插入了


          各项参数解释

          1、pt-table-checksum参数解释

          参数

          参数说明

          备注

          --[no]check-replication-filters

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

          默认不检查

          --no-check-binlog-format

          不检查复制的binlog模式,要是binlog模式是ROW,则会报错。

          默认是监测,使用默认值,如果添加该参数可能导致diff不出来

          --replicate-check-only



          只显示不同步的信息。



          开启这个,可以减少输出并且显示不一致的从库主机名

          不过这个只是显示已经检测过的不一致信息,并不能显示当前的。

          --replicate=



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

          默认会创建percona库下checksum表

          -h -u -p -P


          masterIP 监测账号 密码 端口


          --databases=

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

          --tables=

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

          --recursion-method



          指定监测从库的模式,默认使用processlist(仅监测3306端口),也可以指定dsn

          多个从库可以这样指定。--recursion-method=dsn=h=host,D=pt,t=dsns

          D 库名 t 表名

          --quiet

          安静模式,最小化打印,纸打印错误行

          与--replicate-check-only类似,但不显示从库信息


          2、pt-table-sync参数解释

          参数

          参数说明

          备注

          --replicate=

          指定通过pt-table-checksum得到的表默认会创建percona库下checksum表时不需要指定

          --databases=

          指定执行同步的数据库

          在只修复指定的库时使用

          --tables=

          指定需要被修复的表,多个用逗号隔开


          --sync-to-master

          指定一个DSN,即从的IP

          会通过show processlist或show slave status 去自动的找主。报错找不到主库时使用

          h= u= p=

          服务器地址,账号,密码

          命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。

          --print

          打印修复的sql语句

          只打印不执行。

          --exec 或 --execute

          执行修复

          --algorithms=c

          指定修复算法

          default Chunk,Nibble,GroupBy,Stream 在报错算法问题的时候需要指定算法

          --charset=

          指定默认字符集

          如果数据中包含中文不指定次字符集的话修复不成功







          美创是国内领先的数据库服务提供商。服务团队拥有PG ACED 1名、Oracle&PG ACE 3人、DSI智库专家5名、DSMM测评师7名、OCM 20余人、数十名Oracle OCP、MySQL OCP、TDSQL TCP、OceanBase OBCP、TiDB PTCP、达梦 DCP、人大金仓、红帽RHCA、中间件weblogic、tuxedo、CISP-DSG、CISSP、CDGA、CDPSE、CZTP、CDSP等认证人员,著有《DBA攻坚指南:左手Oracle,右手MySQL》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》,《Oracle DBA实战攻略》等多本数据库书籍。运维各类数据库合计5000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、MongoDB、Redis、TDSQL、OceanBase、达梦、人大金仓等主流商业和开源数据库。美创拥有完善的运维体系和人员培养体系,并同时提供超融合、私有云整体服务解决方案、数据安全咨询及运营服务方案等,已为金融、政府、企业、能源等多个行业的客户提供量身定制的各类服务,赢得了客户的高度赞誉和广泛认可。



          文章转载自新运维新数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论