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

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

  1. mysql> SHOW SLAVE STATUS\G
  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

mysql 主从一致性检查的更多相关文章

  1. mysql主从一致性校验工具-pt

    一.环境 1.系统环境 系统 IP 主机名 说明 server_id centos6.7 MasterIP master 数据库:主 177  centos6.7 SlaveIP slave 数据库: ...

  2. pt工具主从一致性检查并修复以及版本3.0.4的版本缺点

    pt-table-checksum和pt-table-sync分别检验master-slave的数据不一致并修复. 1.本次测试环境 [root@172-16-3-190 we_ops_admin]# ...

  3. MySQL主从配置详解

    一.mysql主从原理 1. 基本介绍 MySQL 内建的复制功能是构建大型,高性能应用程序的基础.将 MySQL 的 数亿分布到到多个系统上去,这种分步的机制,是通过将 MySQL 的某一台主机的数 ...

  4. 使用pt-table-checksum检查主从一致性

    使用 percona 工具检查主从不一致 可以使用 pt-table-checksum  工具检查主从数据的一致性,检查完之后默认会生成一个 percona 库以及一个 checksums 表,记录了 ...

  5. pt-table-checksum 主从复制一致性检查

    1. pt-table-checksum介绍 http://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html pt-tabl ...

  6. (5.10)mysql高可用系列——percona-toolkit工具下的pt-table-checksum 在线验证主从一致性【续写中】

    关键词:percona-toolkit 工具包中包含 pt-table-checksum工具,在线验证主从一致性 [1]percona-toolkit 工具包 [1.1]percona-toolkit ...

  7. MySQL 使用pt-table-checksum 检查主从数据一致性 (实例转)

    1.基本环境: Mysql版本:5.6.12-log Percona-toolkit:2.2.18 Linux:centos6.5 2.安装 源码安装: # 一些依赖包 yum install per ...

  8. 检查Mysql主从状态

    .检查MySQL主从同步状态 #!/bin/bash USER=bak PASSWD=123456 IO_SQL_STATUS=$(mysql -u$USER -p$PASSWD -e  show s ...

  9. 用脚本定时监控SQL Server主从一致性

    用脚本定时监控SQL Server主从一致性 首先说一下我们的环境 我们使用的是事务复制,复制是单向的,主服务器和从服务器都在同一个机房,当然不同机房也可以,只需要改一下IP和端口 下面的脚本在我们的 ...

随机推荐

  1. (贪心5.1.2)POJ 2287 Tian Ji -- The Horse Racing

    /* * POJ_2287.cpp * * Created on: 2013年10月9日 * Author: Administrator */ #include <iostream> #i ...

  2. 【转】基于RMAN实现坏块介质恢复(blockrecover)

    本文转自:乐沙弥的世界 对于物理损坏的数据块,我们可以通过RMAN块介质恢复(BLOCK MEDIA RECOVERY)功能来完成受损块的恢复,而不需要恢复整个数据库或所有文件来修复这些少量受损的数据 ...

  3. Redis集群战法整理

    单机及集群搭建 http://www.codeceo.com/article/distributed-caching-redis-server.html 主从复制设置 Redis服务器复制(主—从配置 ...

  4. Java+7入门经典 -2 数据

    第2章 程序,数据,变量和计算 2.1 数据和变量 变量是一段有名字的内存, 存储程序中的信息, 描述事物的数据项; 每段定义了名字的内存只能存储一种特定类型的数据. Type; 编译器会检测错误的类 ...

  5. Javascript模板引擎handlebars使用实例及技巧

    转:http://rfyiamcool.blog.51cto.com/1030776/1278620 我们在开发的时候针对DOM操作,用简单的JS应用来说不成问题,但如果你对视图的每次更新都需要对我文 ...

  6. stl之deque双端队列容器

    deque与vector很相似,不仅能够在尾部插入和删除元素,还能够在头部插入和删除. 只是当考虑到容器元素的内存分配策略和操作性能时.deque相对vector较为有优势. 头文件 #include ...

  7. QTP下载链接

    QTP下载链接 QTP官网下载:http://www8.hp.com/us/en/software-solutions/software.html?compURI=1172957#.UNMOQ2_FW ...

  8. android的Broadcast receiver

    broadcast receiver是用来监听intent的. android大量使用了broadcast receiver,比如:开机.电话打进来.发送消息,手机电量过低 有两种方式注册broadc ...

  9. [Whole Web] [AngularJS] Localize your AngularJS Application with angular-localization

    It is best to start your application's localization efforts early in development, even if you only s ...

  10. 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA

    1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.sec ...