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. 深度学习caffe测试代码c++

    #include <caffe/caffe.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui ...

  2. IOCP IO完成端口

    一. IO完成端口概念 IO完成端口的出现是为了解决并发模型中可运行线程上下文切换开销过大而出现的. 在<Windows核心编程>的描述中,IO完成端口是Wnidows系统提供的最复杂的内 ...

  3. IIC协议解释(转)

    IIC协议解释 推荐资源: http://m.elecfans.com/article/574049.html       and       https://blog.csdn.net/firefl ...

  4. ssh 免密登陆

    A 要免密码登录要B 那么需要在A电脑上使用命令 ssh-keygen -t rsa 在~/.ssh/ 目录下生成id_rsa.pub 这个文件,然后将这个文件的内容拷到B电脑de ~/.ssh/au ...

  5. 循环神经网络-RNN进阶

    这部分许多内容要类比CNN来进行理解和解释,所以需要对CNN比较熟悉. RNN的特点 1. 权值共享 CNN权值共享,RNN也有权值共享,在入门篇可以看到RNN结构图中,权重使用的是同样的字母 为什么 ...

  6. string使用方法

    转载自:https://blog.csdn.net/tengfei461807914/article/details/52203202 使用场合: string是C++标准库的一个重要的部分,主要用于 ...

  7. vs2017 乱码

    vs2017默认编码方式并不是UTF-8,似乎是UTF-16,当我们使用中文时,经常会发生乱码. 解决方法:工具->扩展和更新->联机,然后搜索ForceUTF8 我这里已经安装了,没安装 ...

  8. MVC4中使用Uploadify3.2

    你使用过 GMail 中附件上传吗?带有上传进度,可以取消正在进行的上传,使用 Uploadify 插件,你也可以做到. Uploadify 是 JQuery 一个著名的上传插件,利用 Flash 技 ...

  9. 二、先在SD卡上启动U-boot,再烧写新的U-boot进Nandflash

    1. 制作SD卡 先准备一张2G的SD卡(不能用8G的,2G的卡和8G的卡协议不一样),和烧写SD卡的工具write_sd以及需要烧写到SD卡中的u-boot-movi.bin.将SD卡格式化后连接到 ...

  10. Linux下的shell与make

    Linux下的shell与make 一.shell 1.1 什么是shell ● 用户与Linux的接口 ● 命令解释器 ● 支持多用户 ● 支持复杂的编程语言 ● Shell有很多种,如:csh,t ...