pt-table-checksum用来检测主从数据库上的数据一致性,其原理是通过在主库上运行一系列的MySQL函数计算每个表的散列值,并利用主从关系将相同的操作在从服务器上重放(基于statement格式的binlog),从而获取到主从服务器上的散列值然后比较散列值判定主从数据是否一致。

对于表中的单行数据,先检查每一列的数据类型,然后将所有的数据类型转换为字符串,再使用concat_ws()函数进行连接,然后根据连接后得到的字符串计算出checksum的值,默认的checksum算法为crc32。

对于数据量较大的表,如果单次计算整表的checksum值,会导致主库性能压力和主从延迟,因此会根据chunk_size和chunk_time等参数来对表进行拆分为多个chunk,计算chunk时,将该chunk中所有行的数据拼接起来进行checksum计算。

=================================================

操作原理

在开始checksum计算时,会先修改binlog_format为STATEMENT,使得主库上进行的计算操作在从库上重放。
/*!50108 SET @@binlog_format := 'STATEMENT'*/

然后对表数据拆分为chunk进行checksum计算,由于使用STATEMENT的二进制格式,主库和从库都会进行分别计算,如果主库数据不一致,则会导致this_cnt和this_crc两列的数据不同。
如下面对`testdb1`.`tb1001`表的`id` >= '4621' and `id` <= '158655'作为一个chunk进行checksum计算并插入到目标表的语句
REPLACE INTO `pt`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc)
SELECT 'testdb1', 'tb1001', '3', 'PRIMARY', '4621', '158655',
COUNT(*) AS cnt,
COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `id`,`c1`, `c6`, `c3`,
CONCAT(ISNULL(`c1`), ISNULL(`c6`), ISNULL(`c3`)))) AS UNSIGNED)), 10, 16)),) AS crc
FROM `testdb1`.`tb1001`
FORCE INDEX(`PRIMARY`)
WHERE ((`id` >= '4621'))
AND ((`id` <= '158655')) /*checksum chunk*/

然后获取主库的上该chunk的计算值this_cnt和this_crc,将这两值更新到master_crc和master_cnt列中
SELECT this_crc, this_cnt FROM `pt`.`checksums` WHERE db = 'testdb1' AND tbl = 'tb1001' AND chunk = '3';
UPDATE `pt`.`checksums` SET chunk_time = '0.266288', master_crc = '8580b9c2', master_cnt = '90552' WHERE db = 'testdb1' AND tbl = 'tb1001' AND chunk = '3'

上面更新操作传递到从库上后,从库上的`pt`.`checksums` 表便拥有主库的checksum值和从库自己的checksum值,因此在从库上将master_crc和master_cnt列与this_cnt和this_crc两列进行对比即可以判断该chunk段数据是否有差异。

=================================================

使用要求

1、对执行检查的账户,需要有SELECT, PROCESS, SUPER, REPLICATION SLAVE的权限

GRANT ALL ON *.* TO TO 'checksum_user'@'%' IDENTIFIED BY 'checksums_pwd';

2、主从复制正常

=================================================

常用参数:

--host=<MASTER_HOST> 			##主库IP
--port=<MASTER_PORT> ##主库端口
--user=<MASTER_USER> ##主库用户
--password=<MASTER_PASSWORD> ##用户密码
--replicate=test.checksums ##checksum结果存放的表
--databases=<check_database> ##要检查的数据库名
--nocheck-replication-filters ##忽略replication-do-db规则
--check-replication-filters ##如果设置replication-do-db规则,则不进行checksum
--ignore-databases=<ignore_database_name> ##不检查的数据库
--tables=<table_name> ##需要检查的表
--ignore-tables=<ignore_table_name> ##不检查的表
--recursion-method=<methon_name> ##processlist,hosts,默认使用SHOW PROCESSLIST来获取从库信息

=================================================

常用脚本:

## 检查除test和mysql以外所有数据库,并将检查结果放入到percona_db.checksum_result
pt-table-checksum \
--host="127.0.0.1" \
--port=3358 \
--user="checksum_user" \
--password="checksums_pwd" \
--recursion-method="processlist" \
--nocheck-binlog-format \
--nocheck-plan \
--nocheck-replication-filters \
--replicate=percona_db.checksum_result\
--set-vars="innodb_lock_wait_timeout=120" \
--ignore-databases="test,mysql"
## 查看表级别是否存在数据不一致
## pt-table-checksum命令执行成功后,在从库上查询 SELECT db AS database_name,
tbl AS table_name,
SUM(this_cnt) AS total_rows, COUNT(*) AS chunks
FROM `percona_db`.`checksum_result`
WHERE ( master_cnt <> this_cnt
OR master_crc <> this_crc
OR ISNULL(master_crc) <> ISNULL(this_crc) )
GROUP BY db, tbl;
## 查看chunk级别是否存在数据不一致
## pt-table-checksum命令执行成功后,在从库上查询
SELECT *
FROM `percona_db`.`checksum_result`
WHERE ( master_cnt <> this_cnt
OR master_crc <> this_crc
OR ISNULL(master_crc) <> ISNULL(this_crc) );

=================================================

使用DNS方式

recursion-method有四种参数:

1、processlist,在主库上使用SHOW PROCESSLIST方式查询从库信息
2、hosts,在主库上使用SHOW SLAVE HOSTS方式查询从库信息
3、dsn,使用DSN方式获取从库信息
4、no,不考虑

DSN(Data Source Name),数据源名称,DSN包含数据库连接信息,使用逗号将多个连接参数分割。

D: DSN表所在的数据库名。
h: 从库的host。
p: 从库的密码。当密码包括逗号(,)时,需要使用反斜杠转义。
P: 从库的端口。
S: 连接使用的socket文件。
t: 存储DSN信息的DSN表名。
u: 从库的MySQL用户名。

假设当前有服务器信息:

主库:192.168.1.101:3358

从库:192.168.1.102:3359

Canel:192.168.1.102:3360

由于当前有从库和Canel都从主库请求日志,且端口不同,如果只希望检查主从之间的数据一致,则可以使用DSN方式。

首先在主库上创建表并录入要检查从库的信息:

CREATE DATABASE percona_db;

CREATE TABLE percona_db.slave_dsn (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`dsn` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);

INSERT INTO percona_db.slave_dsn(dsn)
VALUES('h=192.168.1.102,P=3359,u=checksum_user,p=checksums_pwd');

使用DSN方式进行检查

pt-table-checksum \
--host="192.168.1.101" \
--port=3358 \
--user="checksum_user" \
--password="checksums_pwd" \
--recursion-method dsn=D=percona_db,t=slave_dsn \
--nocheck-binlog-format \
--nocheck-plan \
--nocheck-replication-filters \
--replicate=percona_db.checksum_result \
--set-vars="innodb_lock_wait_timeout=120" \
--ignore-databases="test,mysql"

Percona Toolkit之pt-table-checksum学习的更多相关文章

  1. Percona Toolkit mysql辅助利器

    1 PT介绍 Percona Toolkit简称pt工具—PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在 ...

  2. Percona Toolkit工具使用

    Percona Toolkit简称pt工具-PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在线DDL等 下 ...

  3. RDS for MySQL 如何使用 Percona Toolkit

    Percona Toolkit 包含多种用于 MySQL 数据库管理的工具. 下面介绍常用的 pt-online-schema-change  和  pt-archiver 搭配 RDS MySQL ...

  4. Percona Toolkit工具集介绍

    部署mysql工具是一个非常重要的部分,所以工具的可靠性和很好的设计非常重要.percona toolkit是一个有30多个mysql工具的工具箱.兼容mysql,percona server,mar ...

  5. Want to archive tables? Use Percona Toolkit’s pt-archiver--转载

    原文地址:https://www.percona.com/blog/2013/08/12/want-to-archive-tables-use-pt-archiver/ Percona Toolkit ...

  6. Percona Toolkit工具连接MySQL 8报错的解决方案

    使用Percona Toolkit的工具连接MySQL 8.x数据库时,会遇到类似"failed: Plugin caching_sha2_password could not be loa ...

  7. Centos 安装Percona Toolkit工具集

    1.下载 下载地址:   https://www.percona.com/downloads/percona-toolkit/LATEST/ [root@bogon ~]# wget https:// ...

  8. NXP ARM Vector Table CheckSum

    Signature Creator for NXP Cortex-M Devices Algorithm for creating the checksum The reserved Cortex-M ...

  9. Percona Toolkit 使用

    安装 percona-toolkit perl Makefile.PL make make test make install 默认安装到 /usr/local/bin 目录下 可能需要 DBI-1. ...

随机推荐

  1. Mac 无需网线创建ipv6环境

    首先需要准备Mac一台 iPhone 2部(其中一部用于测试你的项目,请装上你的应用) 连接线一根 第一步:通过数据线连接iphone和mac 第二步:打开iphone的个人热点并选择仅USB 如果没 ...

  2. HDU 2602 Bone Collectors(背包问题,模版)

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. DevExpress WinForms使用教程:WinForms Fluent Design和Acrylic Effects

    在先前的版本发布中,宣布支持Fluent Design Form和Acrylic effects——旨在复制Microsoft下一代UI metaphor的新功能.本文主要介绍如何实现此功能,并明确说 ...

  4. L327 找灵魂伴侣

    Looking for the Perfect Partner I'm sure we all remember a time when we fell in love. For some it wa ...

  5. 使用Maven+ssm框架搭建一个web项目

    1,前期准备:Eclipse(Mars.2 Release (4.5.2)).jdk1.7.tomcat7.maven3.2.1 2.使用eclipse中的maven新建一个web项目 点击next: ...

  6. js闭包 选择器 面向对象 事件 操作页面

    闭包js函数的嵌套定义,定义在内部的函数 就称之为闭包为什么使用闭包: 1.一个函数要使用另一个函数的局部变量 2.闭包会持久化包裹自身的函数的局部变量 3.解决循环绑定 function outer ...

  7. ftell

    ftell:当前位置rewind:不管文件指向哪,它都会还原指向首部 缓存区的作用:大多数情况下是好事,合并系统调用行缓冲:换行.满了.强制(标准输出)刷新全缓冲:满了.强制(默认,只要不是终端)刷新 ...

  8. iOS原生和React-Native之间的交互1

    今天,记录一下iOS原生和React-Native之间的交互.如果第一次接触最好先移步至 http://www.cnblogs.com/shaoting/p/6388502.html 先看一下怎么在i ...

  9. JavaScript中的内置对象-8--2.String-符串对象 方法; 截取方法; 综合应用; 其他方法;

    JavaScript内置对象-2String(字符串) 学习目标 1.掌握字符串对象 方法: charAt() charCodeAt() indexOf() lastIndextOf() charAt ...

  10. php经典算法实现(转)

    <?  //--------------------  // 基本数据结构算法 //--------------------  //二分查找(数组里查找某个元素)  function bin_s ...