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 :执行命令

最新文章

  1. 小机房的树 codevs 2370
  2. Html页面插入flash代码
  3. SQL Server :事务和锁
  4. poj 3414 Pots ( bfs )
  5. 我的第一个JApplet-绘制笑脸
  6. c++ 覆盖、重载、隐藏
  7. DirectFB 之 通过多Window实现多元素处理
  8. vs2015添加ActiveX Control Test Container工具(转载)
  9. 基于 HTML5 WebGL 的 3D 网络拓扑图
  10. PostgreSQL 下生成 UUID(Guid)
  11. 用JavaScript实现动态省市县三级联动
  12. jmeter发起form-data格式
  13. vue动态绑定background:url绑不上的问题
  14. js判断一个元素是否在数组中
  15. Keepalived详解(三):Keepalived基础功能应用实例【转】
  16. NSIS程序安装包制作
  17. windows php7 安装 mongodb 扩展
  18. quartz实现定时任务
  19. python函数的创建和函数参数
  20. zookeeper 官方文档——综述

热门文章

  1. docker在Windows环境下的安装
  2. 中国大学MOOC课程信息之数据分析可视化二
  3. 【16】大调 Leading Bass
  4. 大数据之路week04--day05(java 正则表达式)
  5. 第69题:x的平方根
  6. 前端知识体系:JavaScript基础-作用域和闭包-JavaScript的作用域和作用域链
  7. Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
  8. Shell 04 字符串处理、正则表达式
  9. Java集合总结(二):Map和Set
  10. webstorm双击鼠标出现光标块