pt-table-checksum解读

pt-table-checksum是目前可以说是最好的查看主从一致性的工具

先来个使用例子,有助快速上手使用

在主库执行来创建执行用户:

mysql>GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO ‘USER‘@‘MASTER_HOST‘ identified  by ‘PASSWORD‘;
注:创建用户,这些权限都是必须的,否则后续执行时会报错,当然,如果不想授予这么多权限,那就去看看文档,把权限对应的活先自己干了或者直接在命令行指定,注意如果不想设create权限的话,需要看看下面的参数介绍:--replicate

shell> ./pt-table-checksum --host=‘master_host‘ --user=‘user‘ --password=‘password‘ --port=‘port‘ --databases=zabbix --ignore-tables=ignore_table --recursion-method=processlist 
注:(1)如果检查的表比较少的话可以将--ignore-tables替换为--tables,指定要检查的表        (2)recursion-method如果不设的话,会报错:Diffs cannot be detected because no slaves were found. 其参数有四:processlist/hosts/dsn=DSN/no,用来决定查找slave的方式是show full processlist还是show slave  hosts还是命令行直接指定还是压根就不准备找从库,具体见下面参数介绍       (3)主从的端口必须一致,如果不一致的话,需要用DSN方法进行指定,否则会报找不到从库的错误,如果能连到从库但是没有指定端口,默认会寻找3306端口
!!!有一需要特别注意的地方是其要求被检查的主从必须是基于statement-based的复制模式,如果不是statement-based,那就添加参数--no-check-binlog-format来避开binlog格式检查,需     提前确认下!!!!另外,虽然该工具设置了很多检查来保证其使用安全性,但使用过程中毕竟还是会有锁并造成阻塞,所以最好不要在系统特别繁忙的时候使用!!!如果有不一致的情况,用pt-table-sync同步数据后想再重新检查一遍,最好truncate table checksums避免后面查看checksums表时被之前数据干扰;

一.  连接主从库的参数:

--host      --socket      --user    --password    --pid     --port

二.  指定比较范围的参数

1. 指定库

--databases   /   --ignore-databases                       要比较的库   /   比较过程中忽略这些库

--databases-regex   /   --ignore-databases-regex     同上,不过可以用正则匹配

2. 指定表

--tables   /   --ignore-tables                                 要比较的表   /   比较过程中忽略这些表

--tables-regex   /   --ignore-tables-regex               同上,不过可以用正则匹配

3. 指定列

--columns   /   --ignore-columns                          要比较的列   /   比较过程中忽略这些列

4. 直接指定表范围

--where                                                            直接指定表中要比较的范围

5. 根据引擎选表

--engines   /   --ignore-engines                           比较指定的引擎表   /   比较过程中忽略含有这些引擎的表

三.  指定连接中断后行为的参数

--resume     如果主从一致性检查中途中断的话,可以用这个参数来使工具从上次中断时检查的最后一个表开始继续检查

--retries      如果在检查过程中有非致命性的中断的话,如被kill或者从库延迟等,指定该参数后,工具会自动尝试重连

四.  需重点关注的参数

1.  --[no]check-binlog-format  上面说了,不再重复

2.  --recursion-method

参数有四:processlist/hosts/dsn=DSN/no,默认是processlist,hosts,但最好还是指定一下,建议指定--recursion-method=processlist,no一般不使用

dsn=DSN方法使用时,需要先去库里创建一个表,比如在percona库中建一个dnsn表

建表语句是:

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

建好后插入主从复制信息数据,如:insert into table dsns(dsn) values(h=slave_host,u=repl_user,p=repl_password,P=port );

然后就可以使用DSN方法了:命令为:--recursion-method dsn=D=percona,t=dsns.

3.  --replicate

用来指定存放计算结果的表名, 默认是percona.checksums,工具会默认自动创建库percona和表checksums并将checksum的检查结果输入到这个表中,如果自己用该参数去指定表的话,表结构必须是:

CREATE TABLE checksums (
   db             char(64)     NOT NULL,
   tbl            char(64)     NOT NULL,
   chunk          int          NOT NULL,
   chunk_time     float            NULL,
   chunk_index    varchar(200)     NULL,
   lower_boundary text             NULL,
   upper_boundary text             NULL,
   this_crc       char(40)     NOT NULL,
   this_cnt       int          NOT NULL,
   master_crc     char(40)         NULL,
   master_cnt     int              NULL,
   ts             timestamp    NOT NULL,
   PRIMARY KEY (db, tbl, chunk),
   INDEX ts_db_tbl (ts, db, tbl)
) ENGINE=InnoDB;

需要注意的是存储引擎设置,如果检查的表是innodb表,就设置innodb引擎,如果检查的表和checksums表的引擎不一致,如分别是myisam和innodb,会引起复制错误:“different error on master and slave.”!!!

五. 其他部分参数详述:

1.  --[no]check-replication-filters

默认在检查到在主从复制过程中有被用..ignore..过滤掉的表,检查会中断并退出,如果想避开这个检查可以设置--no-check-replication-filters

2.  --chunk-index(type: string)

工具默认在分块时会选取最合适的索引来explain确定chunk的大小,但如果你希望用其他索引来执行,可以用该参数来指定,工具会以FORCE INDEX的形式把指定的索引加进去

3.  --chunk-index-columns(type: int)

可以用来指定组合索引中使用前几个列来辅助分块

4.  --chunk-size

直接确定chunk的大小,默认1000行数据,但不建议使用,建议使用--chunk-time代替

5.  --chunk-time

默认是0.5秒,工具会根据当前系统运行繁忙程度计算出在该指定时间内可以处理的数据行数(即chunk),比较灵活

6. --[no]empty-replicate-table

默认yes,每次检查表之前都去把checksums表中已有的该表信息删掉,以利于后续重新插入新检查信息

7. --float-precision(type: int)

设置浮点数的四舍五入方式,以避免不同版本间或其他特定情况中,主从间因浮点数四舍五入的方式不同而导致查出不一致,If you specify a value of 2, for example, then the values 1.008 and 1.009 will be rounded to 1.01, and will checksum as equal

8. --function

计算checksum值时的函数,默认是CRC32,其他还有FNV1A_64, MURMUR_HASH, SHA1, MD5等

9.  --max-lag

默认1S,主从最大延迟,超过这个延迟时间,就会停下来等待从库同步,确定方法是采用Seconds_Behind_Master的值

10. --progress

指定后可以按设定的参数将执行过程中的运行情况输出到STDERR,如主从延迟时从库的等待,等待时间等,指定时后跟两个参数值,默认是 "time,30",前一个参数有:percentage, time, or iterations;后一个指定百分比,具体时间或者间隔的数目

六.  运行原理

pt-table-checksum默认使用crc32算法来进行数据校验,该工具之所以需要把binlog设置为statement格式,是因为该工具能得出主从是否一致所依赖的就是语句模式基础上同样的SQL语句在主从库上各自的执行结果,主库进行检查后sql语句传给从库,从库执行一遍后,也得到自己的结果,最主要的语句就是:

SELECT COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS(‘#‘, 各种列名)) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `database`.`table` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ‘1‘)) AND ((`id` <= ‘1000‘))

注: where的条件会根据系统繁忙程度计算出要执行的范围

cnt是目前检查的块包括的行数,unsigned就是计算该块数据的校验值

如果主库和从库得出的这两个值都是一样的,那数据就是一致的,如果不一样,那就主从不一致,当然,字符集、浮点数之类的问题需要提前规避,以免错判

工具将主从各自得到的结果处理后放到checksums表中并呈现一些结果在屏幕输出中,work over

时间: 2024-11-10 01:02:38

pt-table-checksum解读的相关文章

NXP ARM Vector Table CheckSum

Signature Creator for NXP Cortex-M Devices Algorithm for creating the checksum The reserved Cortex-M3 exception vector location 7 (offset 0x001C in the vector table) should contain the 2’s complement of the check-sum of table entries 0 through 6. Thi

DROP TABLE 恢复【一】

当DROP TABLE指令敲下的时候,你很爽,你有考虑过后果么?如果该表真的没用,你DROP到无所谓,如果还有用的,这时你肯定吓惨了吧,如果你有备份,那么恭喜你,逃过一劫,如果没有备份呢?这时就该绝望了?NO! 如果你的表是innodb表,那么还有希望挽救,如果是myisam表,那么真的没救了.前面文章介绍了 Recover InnoDB dictionary,这是恢复数据的前提.恢复innodb字典信息使用的是TwinDB recovery toolkit,我们恢复数据也是使用该工具.下面的案

[R] 如何防止read.table读入数据时列名前自动加上&quot;X.&quot;?

最近用之前写的R脚本重新跑数据时,出现了报错.经检查,才发现是数据的列名读入R时发生了变化,列名前自动加上了X.符号. read.table系列函数有一个check.names参数,默认为 TRUE,因此读入数据时它会自动检查变量名在R中是否有效.如果变量名包含首字母为数字.#.$等情况时,则会自动加上X.,使变量看上去更像一个字符型变量. check.names是通过调用make.names函数来实现增加字符这一过程的,如列名为1,2, 3, 4, 5,6时,会自动加上X. make.name

SQL语法详解

ALTER DATABASE修改数据库全局特性 ALTER DATABASE实际上是修改数据库目录中的dp.opt文件 ALTER TABLE修改表的结构 ALTER TABLE对表进行增删列,创建取消索引,重命名列或者表 CREATE DATABASE创建数据库 CREATE INDEX创建索引 CREATE TABLE建表 DROP DATABASE删除数据库 DROP TABLE删表 RANAME TABLE重命名表 数据库的增删改查 INSERT DELETE UPDATE SELECT

用Qemu搭建x86_64学习环境

作者信息 作者:彭东林 邮箱:[email protected] QQ:405728433 软件平台 主机: Ubuntu14.04 64位版本 模拟器:Qemu-2.8.0 Linux内核版本: Linux-4.10 Busybox版本:busybox-1.24.2 工具链: gcc 具备的功能 模拟一个双核或者单核的x86_64架构的系统,根文件系统用ramdisk的形式,跟Host之间采用NFS的方式实现文件共享. 正文 1.Qemu的编译安装 请参考博文用qemu搭建aarch64学习环

怎样从数据库层面检測两表内容的一致性

一般来说呢.怎样检測两张表的内容是否一致,这种需求大多在从机上体现,以保证数据一致性.方法无非有两个,第一呢就是从数据库着手.第二呢就是从应用程序端着手. 我这里罗列了些怎样从数据库层面来解决此类问题的方法.当然第一步就是检查记录数是否一致,否则不用想不论什么其它方法了.这里我们用两张表t1_old,t1_new来演示. 表结构: CREATE TABLE t1_old ( id int(11) NOT NULL, log_time timestamp DEFAULT NULL ) ; CREA

mysql-数据一致性检测

一般来说呢,如何检测两张表的内容是否一致,这样的需求大多在从机上体现,以保证数据一致性.方法无非有两个,第一呢就是从数据库着手,第二呢就是从应用程序端着手. 我这里罗列了些如何从数据库层面来解决此类问题的方法.当然第一步就是检查记录数是否一致,否则不用想任何其他方法了. 这里我们用两张表t1_old,t1_new来演示. 表结构:  CREATE TABLE t1_old (   id int(11) NOT NULL,   log_time timestamp DEFAULT NULL ) ;

[原创]如何从数据库层面检测两表内容的一致性

一般来说呢,如何检测两张表的内容是否一致,这样的需求大多在从机上体现,以保证数据一致性.方法无非有两个,第一呢就是从数据库着手,第二呢就是从应用程序端着手. 我这里罗列了些如何从数据库层面来解决此类问题的方法. 当然第一步就是检查记录数是否一致,否则不用想任何其他方法了. 这里我们用两张表t1_old,t1_new来演示. 表结构:  CREATE TABLE t1_old (   id int(11) NOT NULL,   log_time timestamp DEFAULT NULL ) 

【Oracle】OGG单向复制配置

实验环境: 源端: Ip:192.168.40.10 DataBase:Oracle 11.2.0.1.0 ORCL OS:OEL5.6 OGG:fbo_ggs_Linux_x86_ora11g_32bit 目标端: Ip:192.168.40.128 DataBase:10.2.0.1.0  ORCL OS:OEL5.6 OGG:fbo_ggs_Linux_x86_ora11g_32bit 首先配置好两台机子上的环境变量,在其中增加以下内容并使之生效: export GGATE=$ORACLE

Django添加Last-Modified和ETag

用Django REST Framework做的REST API,其中有个API有这样的需求: APP端请求这个API,服务器端从数据库读数据,返回json.返回的数据量稍微有些大,但是可能一年才修改一次,所以希望能够仅在数据修改的时候才传输数据,让APP端更新. 1. Last-Modified和ETag HTTP响应头Last-Modified和ETag都能实现这个需求,关于二者的详细解释,这篇文章说的简单明了:http://www.iwms.net/n2029c12.aspx 原文摘抄如下