您好,欢迎来到宝玛科技网。
搜索
您的当前位置:首页MySQL主从服务器数据一致性的核对与修复

MySQL主从服务器数据一致性的核对与修复

来源:宝玛科技网


如果你也遇到了类似的问题,可以进入到Perl命令行安装:

shell> perl -MCPAN -e shell
cpan> install ...

安装Percona Toolkit的剩余步骤就是Perl软件的固定打法了:

shell> perl Makefile.PL
shell> make
shell> make install

补充:Percona Toolkit里的pt-slave-restart可以替代sql_slave_skip_counter:

shell> pt-slave-restart
 --host=
 --port=
 --user=
 --password=
 --error-numbers=1062

前戏进行到这里应该可以了,下面让我们直捣黄龙,看看如何解决问题:

MySQL主从服务器数据一致性的核对

通过在主服务器上运行pt-table-checksum,它会通过一系列的MySQL函数计算每个表的散列值,利用主从复制关系,把同样的计算过程在从服务器上重放,从而就拿到了主从服务器各自的散列值,只要比较散列值是否相同就OK了。

这里面有两点需要说明:

  • 计算表的散列值时,pt-table-checksum并不是直接计算整个表的散列值,而是分块计算,这样就避免了造成从服务器长时间的延迟。
  • 因为通过MySQL函数计算散列的过程需要在从服务器上重放,所以主从复制的格式必须是基于STATEMENT的,不能是基于ROW的。
  • 实际操作时的命令大致如下:

    shell> pt-table-checksum \
     --replicate=percona.checksums \
     --host= \
     --user= \
     --password=

    说明:replicate选项指定了结果保存到哪个库和表中,如果你愿意,可以手动查询:

    SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks
    FROM percona.checksums
    WHERE (
     master_cnt <> this_cnt
     OR master_crc <> this_crc
     OR ISNULL(master_crc) <> ISNULL(this_crc))
    GROUP BY db, tbl;

    BTW:多数情况下,只要比较「master_crc <> this_crc」就可以了。

    MySQL主从服务器数据一致性的修复

    通过在主服务器上运行pt-table-sync,它会重建数据,数据通过复制从主服务器同步到从服务器,从而修复了一致性,在操作过程中,可以利用pt-table-checksum的结果。

    shell> pt-table-sync \
     --execute \
     --replicate=percona.checksums \
     --charset= \
     --host= \
     --user= \
     --password=

    说明:因为pt-table-sync会重建数据,所以有一定的风险,最好提前备份好数据。如果仍然不放心,可以使用它提供的「print」选项,它会打印出相应的SQL,你可以审查一下到底执行了那些操作,然后通过手动执行来完成同步。

    在使用Percona Toolkit的时候,细心的网友会发现:在传递参数的时候有两种方式:

  • –host= –user= –password=
  • h=,u=,p=
  • 前一种是选项的形式,后一种是DSN的形式。如果使用了选项的形式,系统会在内部自动转换成DSN的形式,一般不同的信息用DSN的形式,公用的信息则用选项的形式。比如说:我要传递多个DSN主机信息,它们的主机名不同,但用户名和密码都相同,此时我会用选项的形式来传递用户名和密码,而通过DSN的形式来传递主机名。

    本文例子中,我们为了方便,在运行Percona Toolkit命令的时候直接键入了密码等敏感信息,这在很多时候是不安全的,比如说别人可以通过查看命令历史拿到密码。还好我们有「ask-pass」选项可以解决此类问题,实际上我们还可以更进一步,直接把密码等敏感信息保存到配置文件中,最容易想到的配置文件是「~/.my.cnf」,此外,还有几个更官方的配置文件可供选择,我们可以在源代码里看到它们的踪影:

    default_files => [
     "/etc/percona-toolkit/percona-toolkit.conf",
     "/etc/percona-toolkit/$program_name.conf",
     "$home/.percona-toolkit.conf",
     "$home/.$program_name.conf",
    ]

    俗话说:不怕贼偷,就怕贼惦记着。看待问题的态度亦是如此:不怕出问题,就怕问题潜伏在暗处窥视着你,而你却一无所知。大家没事儿的时候多查查主从一致性吧。

    Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6

    违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

    本站由北京市万商天勤律师事务所王兴未律师提供法律服务