1. 安装

yum install -y perl-IO-Socket-SSL.noarch perl-Digest-MD5
yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install percona-toolkit -y

2. 创建校验用户并授权限

GRANT REPLICATION SLAVE,PROCESS,SUPER, SELECT ON *.* TO `checksum_user`@'%' IDENTIFIED BY 'checksum_xxxxxx'; GRANT ALL PRIVILEGES ON percona.* TO `checksum_user`@'%';

3. 校验

  • 全库校验

pt-table-checksum --replicate=percona.checksums --no-check-binlog-format h=127.0.0.1,u=checksum_user,p=checksum_xxxxxx
  • 不校验mysql和test库

pt-table-checksum --replicate=percona.checksums --no-check-binlog-format --ignore-databases mysql,test h=127.0.0.1,u=checksum_user,p=checksum_xxxxxx
  • 只校验db1,db2两个库

pt-table-checksum --replicate=percona.checksums --no-check-binlog-format --databases db1,db2 h=127.0.0.1,u=checksum_user,p=checksum_xxxxxx
  • 只校验db1.t1,db2.t2两张表

pt-table-checksum --replicate=percona.checksums --no-check-binlog-format --tables db1.t1,db2.t2 h=127.0.0.1,u=checksum_user,p=checksum_xxxxxx
  • 使用dsn表校验

使用dns表进行校验的好处是,当校验多个slave不标准3306端口,或者使用不同的校验账号密码,或者只想校验其中一个slave,可以使用这种方法。通过--recursion-method参数指定dns,recursion-method选项有以下几种

METHOD USES
=========== =============================================
processlist SHOW PROCESSLIST
hosts SHOW SLAVE HOSTS
cluster SHOW STATUS LIKE 'wsrep\_incoming\_addresses'
dsn=DSN DSNs from a table
none Do not find slaves
 

首先需要在主库创建一张dsn表,我在percona库下创建,并输入从库连接信息,id和parent_id字段可随意

在新版本的pt-table-ckecksum不用自己添加checksums表,在pt-table-checksum 表时,会在master库上默认生成percona库和表checksums

mysql> create database percona;
mysql> use percona;
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> SELECT * FROM dsns;
+----+-----------+------------------------------------------------------------+
| id | parent_id | dsn |
+----+-----------+------------------------------------------------------------+
| 1 | 1 | h=192.168.0.134,u=checksum_user,p=checksum_xxxxxx,P=3306 |
| 2 | 2 | h=192.168.0.132,u=checksum_user,p=checksum_xxxxxx,P=3307 |
+----+-----------+------------------------------------------------------------+ # 开始验证
shell> pt-table-checksum --replicate percona.checksums --no-check-binlog-format h='master_host',u=checksum_user,p=checksum_xxxxxx --recursion-method dsn=h='dsn_host',u='dsn_user',p='dsn_pass',P='dsn_port',D=percona,t=dsns

4. 列出与主库数据不一致的表

可以在主库上通过--replicate-check-only 参数仅打印数据不一致的表,不会再进行校验

pt-table-checksum --replicate=percona.checksums --replicate-check-only --no-check-binlog-format --ignore-databases mysql h=localhost,u=checksum_user,p=checksum_xxxxxx

也可以在每台从库slave执行下面SQL语句查找哪些表数据和主库不一致

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;

5. 输出结果说明

TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
10-20T08:36:50 0 0 200 1 0 0.005 db1.tbl1
10-20T08:36:50 0 0 603 7 0 0.035 db1.tbl2
10-20T08:36:50 0 0 16 1 0 0.003 db2.tbl3
10-20T08:36:50 0 0 600 6 0 0.024 db2.tbl4
TS:工具完成校验和表时的时间戳
ERRORS:校验表时发生的错误和警告的数量
DIFFS:一个或多个副本上与主节点不同的块的数量,大于0说明这些表数据和主库不一致
ROWS:从表中选择和校验的行数
CHUNKS:表被分成的块的数量
SKIPPED:校验出错跳过块的数量
TIME:校验表时花费的时间
TABLE:已进行校验和的数据库和表

6. 加--replicate-check-only输出结果说明

如果指定了--replicate-check-only,则只会打印检测到的副本上的校验和差异。 
输出不同:每个副本一个段落,每行一个校验和差异,值之间用空格分隔.

Differences on h=127.0.0.1,P=12346
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
db1.tbl1 1 0 1 PRIMARY 1 100
db1.tbl1 6 0 1 PRIMARY 501 600
Differences on h=127.0.0.1,P=12347
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
db1.tbl1 1 0 1 PRIMARY 1 100
db2.tbl2 9 5 0 PRIMARY 101 200
每段第一行列出有差异的从库
TABLE :与主库数据不一致的表。
CHUNK :与主库数据不一致的表的块编号。
CNT_DIFF :从库上的块行数减去主库上的块行数。
CRC_DIFF :如果是1表示从库块上的块的CRC与主库块上的CRC不致,否则为0
CHUNK_INDEX :用于分块表的索引。
LOWER_BOUNDARY :定义块的下边界的索引值。
UPPER_BOUNDARY:定义块的上边界的索引值。

7.  常用参数

--replicate: 将校验结果记录到percona.checksums表中,如果表不存在,默认会自动创建
--databases:指定需要校验的库,多个库用逗号分隔
--ignore-databases: 不需要校验的库,多个库用逗号分隔
--tables:指定需要校验的表,多个表用逗号分隔,不同库的表可以写成db1.t1,db2.t1
--ignore-tables:不需要校验的表,多个表用逗号分隔
--no-check-binlog-format:不检查binlog 格式

数据修复

检测数据不一致的情况使用pt-table-sync进行修复:

pt-table-sync --print --replicate percona.checksums --databases db12 h=172.16.1.168,u=checksum_user,p=checksum_xxxxxx h=172.16.1.131,u=checksum_user,p=checksum_xxxxxx

--replicate :指定通过pt-table-checksum得到的表。
--databases : 指定执行同步的数据库,多个用逗号隔开。
--tables= :指定执行同步的表,多个用逗号隔开。
--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主
h=127.0.0.1 :服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址
u=root :帐号
p=123456 :密码
--print :打印修复的命令,但不执行
--execute :执行命令

mysql主从数据一致性校验和修复的更多相关文章

  1. MySQL主从数据一致性问题修复

    MySQL主从数据一致性问题修复 前面,我们使用pt-table-checksum 可以检测出主从数据是否一致的问题.发现问题后,我们怎么解决这些问题,也是我们必须要会的技能. 修复主从数据一致性问题 ...

  2. 利用mk-table-checksum监测Mysql主从数据一致性操作记录

    前面已经提到了mysql主从环境下数据一致性检查:mysql主从同步(3)-percona-toolkit工具(数据一致性监测.延迟监控)使用梳理今天这里再介绍另一种Mysql数据一致性自动检测工具: ...

  3. 恢复MySQL主从数据一致性的总结

    今日上午,同事告知,MySQL主从数据库的数据不一致,猜测备库在同步过程中出现了问题,于是,登上备库,使用 mysql> show slave status\G查看,果然,备库在insert语句 ...

  4. pt-table-checksum校验mysql主从数据一致性

    主从数据的一致性校验是个头疼的问题,偶尔被业务投诉主从数据不一致,或者几个从库之间的数据不一致,这会令人沮丧.通常我们仅有一种办法,热备主库,然后替换掉所有的从库.这不仅代价非常大,而且类似治标不治本 ...

  5. mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

    转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...

  6. mysql主从同步(4)-Slave延迟状态监控

    mysql主从同步(4)-Slave延迟状态监控  转自:http://www.cnblogs.com/kevingrace/p/5685511.html 之前部署了mysql主从同步环境(Mysql ...

  7. pt工具校验主从数据一致性之dsns方式

    mysql主从数据一致性校验,常用的方法是Percona-Toolkit的组件pt-table-checksum,这东西怎么用网上一大堆,就不啰嗦了.主要说一下通过dsns方式发现从库的一种方式. p ...

  8. MySQL主从修复

    MySQL主从故障修复 测试库:192.168.1.2 主192.168.1.3 从 192.168.1.4 主 4又是2的从库192.168.1.5 从 有人修改了192.168.1.2和192.1 ...

  9. shell脚本修复MySQL主从同步

    发布:thebaby   来源:net     [大 中 小] 分享一例shell脚本,用于修改mysql的主从同步问题,有需要的朋友参考下吧. 一个可以修改mysql主从同步的shell脚本. 例子 ...

随机推荐

  1. Oracle 安装步骤

    目录 Oracle 安装步骤 一.安装流程 二.登录流程 三.新建数据库 四.图形化连接 Oracle 安装步骤 一.安装流程 解压oracle 11g两个压缩文件 点击安装,修改目录,新建一个文件夹 ...

  2. window程序意外关闭自动重启脚本实现

    @echo off : tasklist|find /i "xxxx"||start yyyy ping/n 127.1>nul 新建 .bat 文件,将其写入文件 xxxx ...

  3. 《流畅的Python》Data Structures--第2章序列array

    第二部分 Data Structure Chapter2 An Array of Sequences Chapter3 Dictionaries and Sets Chapter4 Text vers ...

  4. 《图解HTTP》笔记2

    1.SSL(Secure Socket Layer,安全套接层) 1)SSL的作用 通信加密 确定通信方 SSL 提供认证和加密处理及摘要功能 HTTP 协议中没有加密机制,但可以通过和 SSL(Se ...

  5. 甘特图控件如何自定义绘图?DevExpress Winforms帮你忙

    DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅.美观且易于使用的应用程序.无论是Office风格的界面,还是分析处理大批量的业务数据,DevExpr ...

  6. 2018 南京网络预赛Sum - 线性筛

    题意 链接 定义 $f(x)$ 为满足以下条件的有序二元组 $(a, b)$ 的方案数(即 $(a, b)$ 与 $(b, a)$ 被认为是不同的方案): $x= ab$ $a$ 和 $b$ 均无平方 ...

  7. 6、组件注册-@Lazy-bean懒加载

    6.组件注册-@Lazy-bean懒加载 懒加载:单实例bean,默认是在容器启动的时候创建对象:懒加载就是启动的是不创建,在第一次使用的时候再创建对象. @Lazy // 单实例下懒加载bean

  8. 评估类模型之优劣解距离法Topsis模型

    定义: TOPSIS法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距. 层次分析法的局限性: 问题和解决方案: 所以最终评分公式为: 指标正向化,得到正向 ...

  9. Codeforces Round #588 (Div. 2) D题【补题ING】

    思路:先找出现次数>=2数.然后在取跑所有数,需要考虑一般情况(当一个人比另一个人的ai小且他们的与运算等于小的那个人的ai那么可以知道大的那个人必定强于ai小的那个人). 则可以用位运算实现判 ...

  10. MySQL备忘点(上)

    给自己看的,所以以举例子为主了 检索数据 SELECT 检索单列 SELECT name FROM student 检索多列 SELECT no, name FROM student  检索所有列 S ...