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的权限

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

2、主从复制正常

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

常用参数:

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

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

常用脚本:

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

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

使用DNS方式

recursion-method有四种参数:

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

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

  1. D: DSN表所在的数据库名。
  2. h: 从库的host
  3. p: 从库的密码。当密码包括逗号(,)时,需要使用反斜杠转义。
  4. P: 从库的端口。
  5. S: 连接使用的socket文件。
  6. t: 存储DSN信息的DSN表名。
  7. 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方式进行检查

  1. pt-table-checksum \
  2. --host="192.168.1.101" \
  3. --port=3358 \
  4. --user="checksum_user" \
  5. --password="checksums_pwd" \
  6. --recursion-method dsn=D=percona_db,t=slave_dsn \
  7. --nocheck-binlog-format \
  8. --nocheck-plan \
  9. --nocheck-replication-filters \
  10. --replicate=percona_db.checksum_result \
  11. --set-vars="innodb_lock_wait_timeout=120" \
  12. --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. 三:使用docker-machine安装虚拟机上的docker

    1.docker安装之后自带docker-machine:(需要win10专业版或mac) 2.如何远程管理一个docker-machine?(以下是Mac环境) 关闭本地的docker应用.运行do ...

  2. 重载的方式写Python的post请求

    #encoding=utf-8#__author__="Lanyangyang" import unittestimport requestsimport json # This ...

  3. Final阶段第1周/共1周 Scrum立会报告+燃尽图 06

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2485] 版本控制:https://git.coding.net/liuyy08 ...

  4. L253 Valentine's Day

    Are you ready for Valentine's Day, my fellow stargazers? Not sure if you know this, but the astrolog ...

  5. 2019-03-06-day005-字典操作

    情商 别人与你相处感觉很轻松. ?为人处世,有笑点. 照顾对方的情绪. 与别人相处可以很好地解决问题. 你身边总有那么一两个人,别人都喜欢与他交往,和他在一起,很舒服. 情商后天可以提升的. 1,你本 ...

  6. strcmp,stricmp

    strcmp,stricmp:原型:int strcmp(const void *s1, const void *s2);功能:比较字符串s1和s2是否相同,区分大小写. 说明:如果s1=s2则返回零 ...

  7. log4j下载地址及日志文件输入位置配置

    ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the clas ...

  8. gcd和lcm模板

    long long gcd(long long b,long long c)//计算最大公约数{ return c==0?b:gcd(c,b%c);} long long lcm(long long ...

  9. L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  10. undefined is not an object (evaluating '_react2.PropTypes.string')

    对所引用的组件原 .import React, {Component,PropTypes} from 'react' 改成:import React, {Component} from 'react' ...