mysql 主从一致性检查

我上一次遇到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

时间: 2024-09-30 20:06:47

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

mysql 主从一致性检查以及修复

一.简介: 该软件是由由领先的MySQL咨询公司Percona发布的 Percona的很多软件我只能说是强!!!改公司开发的部分工具软件甚至已经超越oracle 自身所开发的工具软件 因此不用怀疑这个公司开发的软件会不会带来什么风险 pt-table-checksum,pt-table-sync 是percona-toolkit工 具集的工具之一用来检查与修复主从不一致数据之用.它通过在主库执行基于statement模式的sql语句来生成主库数据块的总和校验,把相同的sql语句传递到从库,并在从

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

一.环境 1.系统环境 系统 IP 主机名 说明 server_id centos6.7 MasterIP master 数据库:主 177  centos6.7 SlaveIP slave 数据库:从 148 2.软件环境 软件 版本 安装方式 说明 pt工具 3.0.4 编译安装 这是一个综合工具包,包含很多pt命令 mysql数据库 5.6.37 yum安装 主从环境 3.需要用到库 库名 表名 用途  percona checksums 存储pt命令监测的结果,第一次执行检测命令时会自己

检查mysql主从同步结构中的从数据库服务器的状态-脚本shell

检查mysql主从同步结构(一主一从)中的从数据库服务器的状态          (ip授权.从服务器和IO是否正常.从mysql进程是否正常) 主mysql: 192.168.1.10 从mysql: 192.168.1.20 [[email protected] ~]# vi check_slave.sh #!/bin/bash master=192.168.1.10 i=1 service mysqld status &>/dev/null while [ true ] do echo

2-18,19 搭建MySQL主从服务器并并通过mysql-proxy实现读写分离

MySQL主从服务器 实现方式: MySQL  REPLICATION Replication可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave) 默认情况下这种情况属于异步复制,无需维持长连接 通过配置,可以复制所有库或者几个库,甚至库中的一些表 它是MySQL内建的,自带 Replication的原理 主服务器master将数据库的改变写入二进制日志文件,从服务器slave同步这些二进制日志,并生成中继日志,从服务器根据中继日志,执行这些改变 DML:S

源码安装mysql5.6.20&&mysql主从设置(多实例做多个主从)

一.源码安装mysql5.6.20 1.编译环境安装 yum install wget gcc* make openssl openssl-devel openssl-clients -y && yum groupinstall "Development Libraries" -y 2.源码下载(软件见Linux部署源码包) wget -P /usr/local/src/ http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.

搭建mysql主从服务器

搭建mysql主从服务器: //注:注释掉my.cn文件中的skip-federated字段[[email protected] ]# /bin/cp -r /usr/local/mysql/share/mysql/my-huge.cnf  /etc/my.cnf 配置主服务器:修改my.cnf文件server-id=1 //每个数据库服务器都要指定唯一一个server-id log-bin=mysql-bin //mysql进行主从复制时通过二进制日志文件来进行的,所以必须开启mysql日志功

利用percona-toolkit 工具来检测mysql 主从数据库同步以及实现同步

环境: OS: Cenos6.5_x64 , 主:192.168.100.164 ,从:192.168.100.176 软件: percona-toolkit . mysql56-community 同步的库: dj1 , cnhd , shanhu 备要信息:要尽量保证主从mysql的版本相同,因为5.6以上的版本支持了Gtid的特性,与低版本做从主时,会产生不可以预计的问题. 一.安装: Quick Install -------------    perl Makefile.PL    m

mysql主从数据一致性校验及纠错工具

目录 1.概述 2.percona-tooldit工具的安装 3.新建用户 4.pt-table-checksum使用 5.pt-table-sync使用 6.个人总结 1.概述 假如你是一位运维人员,假如你生产环境上部署了mysql系统,再假如你线上的mysql是基于主从复制的架构,那恭喜你,它将可能会带给你主从数据不一致的"恶运". 由于mysql复制架构原生特性,主从服务器上的数据不可能做"同步"复制,所以延时是必然会有的,即使是不那么繁忙的服务器上,在业务不

Linux下mysql主从同步备份master-slave详细配置

1.概要首先要准备两台服务器,一台主服务器(Master),另一台从服务器(Slave),然后要保证Master与Slave的版本要相同且Master不能高于Slave的版本,一般稳健的做法都是使其版本相同,因为MySQL不同版本之间的binlog(二进制日志)格式可能会不一样,最后会导致同步出现异常.介绍先到这里,以下我们先确认两台服务器的信息: 主服务器(Master):IP:192.168.1.100系统:Linux(Ubuntu 64位 v10.10)MySQL版本:5.1.49需要同步