• mysql 主从一致性检查


    我上一次遇到MySQL主从服务器数据一致性问题,想想是几年前的事情了,还依稀记得当时惊慌失措的情景,好在最后借助Maatkit解决了问题。几年后,当我再次面对同样的问题时,Maatkit已经不复存在,转而成为了Percona Toolkit的一部分,不变的是我依旧手忙脚乱,所以还是记录一下吧,保不准啥时候又会遇到这个问题。

    如果你在MySQL从服务器上遇到类似下面的错误信息,那么恭喜你中招了:

    1. mysql> SHOW SLAVE STATUSG 
    2. Last_Error: Error 'Duplicate entry '...' for key ...' on query. 

    为啥会出现唯一索引键值重复?最大的可能是错误的对从服务器做了写操作!出现此类错误的时候,很多人会用sql_slave_skip_counter操作跳过错误,甚至有人写了脚本,如果有多个错误,就循环多次执行sql_slave_skip_counter:

    1. mysql> SET GLOBAL sql_slave_skip_counter = 1; 
    2. mysql> START SLAVE; 

    可惜,即便sql_slave_skip_counter操作能够暂时让主从恢复工作,但多半数据一致性已经被破坏的更严重了,早晚有一天被掩盖的问题会再次爆发出来。

    Percona Toolkit里的pt-table-checksum和pt-table-sync可以搞定此类问题。它们的安装很简单,可以依照自己的操作系统选择下载rpm或者deb软件包来安装,当然也可以使用源代码来安装,不过要注意的是,必须确保系统已经安装了依赖的Perl软件包:

    1. shell> perl -MCPAN -e 'install DBI' 
    2. shell> perl -MCPAN -e 'install DBD::mysql' 
    3. shell> perl -MCPAN -e 'install Term::ReadKey' 

    顺便说一下,我在安装某些Perl模块的时候,出现类似下面的错误提示:

    1. Can’t locate object method “install” via package “…” 

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

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

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

    1. shell> perl Makefile.PL 
    2. shell> make 
    3. shell> make install 

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

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

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

    这里面有两点需要说明:

    计算表的散列值时,pt-table-checksum并不是直接计算整个表的散列值,而是分块计算,这样就避免了造成从服务器长时间的延迟。

    因为通过MySQL函数计算散列的过程需要在从服务器上重放,所以主从复制的格式必须是基于STATEMENT的,不能是基于ROW的。

    实际操作时的命令大致如下:

    1. shell> pt-table-checksum  
    2. --replicate=percona.checksums  
    3. --host=<MASTER_HOST>  
    4. --user=<MASTER_USER>  
    5. --password=<MASTER_PASSWORD

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

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

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

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

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

    1. shell> pt-table-sync  
    2. --execute  
    3. --replicate=percona.checksums  
    4. --charset=<CHARSET>  
    5. --host=<MASTER_HOST>  
    6. --user=<MASTER_USER>  
    7. --password=<MASTER_PASSWORD

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

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

    1. default_files => [ 
    2. "/etc/percona-toolkit/percona-toolkit.conf", 
    3. "/etc/percona-toolkit/$program_name.conf", 
    4. "$home/.percona-toolkit.conf", 
    5. "$home/.$program_name.conf", 
    6. … 

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

     
     以上内容为转载http://os.51cto.com/art/201305/394092.htm
     以下为自我使用命令
     
    脚本
    check_m_s.sh
    #!/bin/sh
    /usr/local/bin/pt-table-checksum --nocheck-replication-filters --databases=UserCenter --replicate=UserCenter.checksums --host=192.168.100.xxx --port=xxxx --user=root --password=xxxxxx
     
     
     
    m_s_sync_print.sh
    #!/bin/sh
    /usr/local/bin/pt-table-sync --replicate=UserCenter.checksums --databases=UserCenteru=roh=127.0.0.1,ot,p=xxxxxx h=192.168.100.xxx,u=root,p=xxxxxx --print --charset=utf8
     
     
    m_s_sync_exec.sh
    #!/bin/sh
    /usr/local/bin/pt-table-sync --replicate=UserCenter.checksums --databases=UserCenter h=127.0.0.1,u=root,p=xxxxxx h=192.168.100.xxx,u=root,p=xxxxxx --execute --charset=utf8
     
     
    /usr/local/percona-toolkit-2.2.16/bin/pt-table-checksum --user='root' --password='780810' --host=192.168.168.xxx --port=3306  --replicate=test.checksum   --nocheck-replication-filters
    --
    可能会报编码错误 在my.cnf  mclient  中把关于utf8mb4的都暂时关闭,然后就能执行了
     
    /usr/local/percona-toolkit-2.2.16/bin/pt-table-checksum --user='root' --password='xxxxxx --host=192.168.168.xxx --port=3306  --replicate=UserCenter.checksums   --nocheck-replication-
    filters
     
    /usr/local/percona-toolkit-2.2.16/bin/pt-table-sync  --print --replicat=UserCenter.checksums --sync-to-master h=192.168.168.xxx,P=3306,u=root,p=xxxxxx --charset=utf8
     
    /usr/local/percona-toolkit-2.2.16/bin/pt-table-sync  --execute --replicat=UserCenter.checksums --sync-to-master h=192.168.168.xxx,P=3306,u=root,p=xxxxxx --charset=utf8
  • 相关阅读:
    作为一枚第二天上班的小小.net程序员(技术宅的那种)很迷茫哦,第一个随笔
    清除NT Kernel & System占用80端口
    case then 的用法 貌似case then不支持别名
    syscomments 可以用来查找所有关于库中用到的某个关键词的所有相关脚本
    查看系统表存储过程名称SELECT *,OBJECT_NAME(id) FROM syscomments
    毫秒级百万数据分页存储过程
    使用sp_configure启用 'Ad Hoc Distributed Queries'
    使用 ServKit(PHPnow) 搭建 PHP 环境[图]
    apache+php+mysql常见集成环境安装包
    Quartz.NET作业调度框架详解
  • 原文地址:https://www.cnblogs.com/cuizhipeng/p/5043005.html
Copyright © 2020-2023  润新知