pt-table-checksum 使用介绍

发布时间 2023-12-16 13:43:46作者: abce

说明

pt-table-checksum 验证 mysql 复制的完整性。

语法:

pt-table-checksum [OPTIONS] [DSN]

pt-table-checksum 通过在主节点上执行校验和查询来执行在线复制一致性检查,从而在与主节点不一致的从库上产生不同的结果。可选的 DSN 指定了主节点。如果发现任何差异,或出现任何警告或错误,pt-table-checksum的 "退出状态"(EXIT STATUS)将为非零值。

下面的命令将连接到本地的复制主节点,对每个表进行校验,并报告每个检测到的从库的结果:

pt-table-checksum

该工具的重点是有效地查找数据的差异。如果有任何数据不同,可以使用 pt-table-sync 来解决。

pt-table-checksum 一次只处理一张表,因此不会积累大量内存,也不会在开始校验前做大量工作。

pt-table-checksum 能在超大型表上运行的一个原因是,它将每个表划分为若干行块,并通过单个 REPLACE...SELECT 查询对每个行块进行校验。它可以改变块的大小,使校验和查询在所需的时间内运行。对表进行分块处理,而不是对每个表进行一次大查询,目的是确保校验和不会造成干扰,也不会对服务器造成过多的复制延迟或负载。这就是为什么每个分块的目标时间默认为 0.5 秒的原因。

该工具会跟踪服务器执行查询的速度,并在进一步了解服务器性能后调整分块。它使用指数衰减加权平均值来保持分块大小稳定,但如果服务器性能在校验过程中因任何原因发生变化,它仍能保持响应。这意味着,如果服务器在流量激增或后台任务等情况下负载过重,该工具会迅速自我节流。

分块是通过被称为 "nibbling "的技术实现的。例如,pt-archiver 使用的也是这种技术。旧版本的 pt-table-checksum 中使用的传统分块算法已被移除,因为这些算法无法产生可预测大小的分块,而且在许多表上效果不佳。将表划分为块所需的只是某种索引(最好是主键或唯一索引)。如果没有索引,而表中包含的行数又很少,那么该工具就会对表进行单块校验。

pt-table-checksum还有许多其他保障措施,以确保它不会干扰任何服务器(包括从库)的运行。

为此,pt-table-checksum 会自动检测从库并连接它们。(如果失败,可以使用 --recursion-method 选项给它一个提示)。

pt-table-checksum会持续监控从库。如果任何从库在复制过程中落后太多,pt-table-checksum 就会暂停,让它赶上。如果任何从库出现错误或复制停止,pt-table-checksum 会暂停并等待。此外,pt-table-checksum 还会查找问题的常见原因,如复制过滤,除非你强迫它执行,否则它不会执行。复制过滤很危险,因为pt-table-checksum 执行的查询有可能与之冲突,导致复制失败。

pt-table-checksum 会验证数据块是否过大,以便安全地进行校验。它会对每个数据块执行 EXPLAIN 查询,并跳过可能大于所需行数的数据块。你可以使用 --chunk-size-limit 选项配置这种保护措施的灵敏度。如果表的行数较少,需要在单个块中进行校验和,pt-table-checksum 会额外验证复制的表是否过大。这就避免了以下情况:主表是空的,但从库上的表非常大,在单个大查询中进行校验和,从而导致复制延迟时间过长。

还有其他一些保障措施。例如,pt-table-checksum 将其会话级 innodb_lock_wait_timeout 设置为 1 秒,这样如果出现锁等待,它就会成为受害者,而不会导致其他查询超时。另一个保障措施是检查数据库服务器的负载,如果负载过高,就会暂停。如何做到这一点并没有唯一正确的答案,但默认情况下,如果同时执行的查询超过 25 个,pt-table-checksum 就会暂停。你或许应该使用 --max-load 选项为你的服务器设置一个合理的值。

校验和通常是一项低优先级任务,应该让位于服务器上的其他工作。然而,一个必须不断重启的工具很难使用。因此,pt-table-checksum 对错误有很强的适应能力。例如,如果数据库管理员出于某种原因需要杀死 pt-table-checksum 的查询,这并不是致命错误。用户经常运行 pt-kill 来杀死任何长期运行的校验和查询。该工具会重试一次被杀死的查询,如果再次失败,就会转到该表的下一块。如果出现锁等待超时,也会出现同样的情况。如果出现这种错误,工具会打印警告,但每个表只打印一次。如果与任何服务器的连接失败,pt-table-checksum 会尝试重新连接并继续工作。

如果pt-table-checksum 遇到导致其完全停止的情况,可以使用 --resume 选项轻松恢复。它将从上一次处理的表的最后一块开始。你也可以使用 CTRL-C 安全地停止工具。它将完成当前处理的数据块,然后退出。之后,你可以像往常一样继续使用它。

在 pt-table-checksum 完成对表中所有数据块的校验和后,它会暂停并等待所有检测到的从库完成校验和查询。执行完毕后,它会检查所有从库是否拥有与主表相同的数据,然后打印一行输出结果。你可以在本文档稍后部分看到其输出示例。

该工具会在耗时的操作过程中打印进度指示符。在对每个表进行校验和时,它都会打印进度指示符。进度根据表中的估计行数计算。在暂停等待复制跟上时,以及在等待检查复制与主表的差异时,也会打印进度报告。你可以使用 --quiet 选项使输出不那么冗长。

如果愿意,还可以手动查询校验和表,以获得哪些表和块与主表存在差异的报告。下面的查询将报告存在差异的每个数据库和表,以及可能受影响的块和行的数量:

SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunksFROM percona.checksumsWHERE ( master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc))GROUP BY db, tbl;

该查询中引用的表是校验和表,校验和存储在该表中。表中的每一行都包含服务器中某个表的一个数据块的校验和。

2.0 版 pt-table-checksum 并不向后兼容 1.0 版 pt-table-sync 。但这问题并不严重,可以手工解决,官方文档提供了方案,需要可以翻看文档。

请注意,pt-table-checksum 默认使用 CRC32 校验和。CRC32 不是加密算法,因此容易发生碰撞。另一方面,CRC32 算法比 MD5 和 SHA1 更快,对 CPU 的消耗也更少。

 

限制

1.使用基于行的复制

pt-table-checksum需要基于语句的复制,它在主节点上设置了 binlog_format=STATEMENT,由于MySQL的限制,这一设置并不会传递到从库进行。因此当从库的binlog格式是ROW时,无法直接对从库的从库进行校验操作。工具在进行校验操作时都会检查所有从库的binlog_format,可以使用选项--[no]check-binlog-format进行控制;

2.Schema和表差异

该工具假定主从节点上的模式和表完全相同。例如,如果从节点没有主服务器上存在的模式(且该模式已校验和),或者从节点上的表结构与主服务器上的不同,复制就会中断。

 

DSN选项

DSN选项是用来创建DSN的。每个选项的格式是option=value,选项是大小写敏感的,比如P和p是不同的选项。在=的前后不可以有空格,如果值中间有空格,必须用引号引起来。多个选项之间用逗号分割。

·A:指定字符集·D:指定需要同步的数据库·F:连接的值所在的默认文件·h:指定要连接的HOST·p:指定连接的用户名密码·P:指定要连接的PORT·S:指定连接所使用的SOCKET文件(Unix systems)·t:指定需要同步的表·u:指定连接的用户名

 

输出结果分析

            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE12-14T17:55:54      0      1       10          5       1       0   0.325 myabc.dummy12-14T17:55:54      0      0        6          0       1       0   0.322 sys.sys_config
每行对应一张表。其中:

·TS:完成检验的时间戳

·ERRORS:遇到错误或警告的错误

·DIFFS:有差异的块的数量;如果指定了--no-replicate-check,该值就是0;如果指定了--replicate-check-only,只会显示有差异的表

·ROWS:被执行校验和的行数。如果使用了where 过滤,该值就可能会不等于表记录的行数

·DIFF_ROWS:每块中差异的最大值;如果一个块是2,一个块是3,这里就是3

·CHUNKS:表备份分成的块数

·CHUNKS:因为以下一些问题,导致被跳过的块数;

* MySQL not using the --chunk-index* MySQL not using the full chunk index (--[no]check-plan)* Chunk size is greater than --chunk-size * --chunk-size-limit* Lock wait timeout exceeded (--retries)* Checksum query killed (--retries)

·TIME:运行的时间

·TABLE:库名.表名

 

pt-table-checksum 退出的状态

退出状态可能有三种状态值:0、255、其它掩码值

其中:

·0:表示没有错误、警告、差异和跳过的块或表

·255:表示致命性错误。换句话说,该工具运行死掉或奔溃了

·其它掩码值:含义如下

FLAG              BIT VALUE  MEANING================  =========  ==========================================ERROR                     1  A non-fatal error occurredALREADY_RUNNING           2  --pid file exists and the PID is runningCAUGHT_SIGNAL             4  Caught SIGHUP, SIGINT, SIGPIPE, or SIGTERMNO_SLAVES_FOUND           8  No replicas or cluster nodes were foundTABLE_DIFF               16  At least one diff was foundSKIP_CHUNK               32  At least one chunk was skippedSKIP_TABLE               64  At least one table was skippedREPLICATION_STOPPED     128  Replica is down or stopped

 

选项说明

--ask-pass命令行提示密码输入,保护密码安全,前提需安装模块perl-TermReadKey。--channel指定复制通道--[no]check-binlog-format默认值:yes定检查所有服务器上的binlog_format系统参数是否相同。--binary-index该选项修改了 --create-replicate-table 的行为,使复制表的上下边界列以 BLOB 数据类型创建。当对包含二进制数据类型的键或具有非标准字符集的表进行校验时遇到困难,这个选项就非常有用。请参阅--replicate。--check-interval默认值:1s指定因为选项'--max-lag'检查之间休眠时间。--[no]check-plan默认值: yes检查查询执行计划的安全性。默认情况下,该选项会导致pt-table-checksum 在运行查询前运行 EXPLAIN,这些查询的目的是访问少量数据,但如果 MySQL 选择了错误的执行计划,则可能会访问许多行。这些查询包括确定分块边界的查询和分块查询本身。如果发现 MySQL 将使用糟糕的查询执行计划,该工具将跳过该表的数据块。该工具使用几种启发式方法来确定执行计划是否糟糕。首先是 EXPLAIN 是否报告 MySQL 打算使用所需的索引来访问行。如果 MySQL 选择了不同的索引,该工具就会认为查询不安全。该工具还会检查 MySQL 报告将在查询中使用多少索引。EXPLAIN 输出会在 key_len 列中显示这一点。该工具会记住看到的最大 key_len,并跳过 MySQL 报告将使用较小索引前缀的数据块。这种启发式方法可以理解为跳过执行计划比其他块更差的块。由于每个表中的执行计划不正确,第一次跳过数据块时,工具会打印警告。虽然可以在工具输出的 "跳过 "列中看到跳过的数据块数,但随后的数据块都会被无声跳过。该选项为每个表和块增加了一些设置工作。虽然这些工作对 MySQL 来说并不麻烦,但会导致与服务器往返次数增多,从而耗费时间。分块太小会导致开销相对增大。因此,建议不要将分块设置得太小,因为如果这样做,工具可能需要很长时间才能完成。--[no]check-replication-filters默认值:yes指定检测主从复制是否有设置复制过滤器。默认如果有设置复制过滤器,则工具不进行检查校验操作。如果在任何从库上设置了复制过滤器,则不进行校验。该工具会查找过滤复制的服务器选项,如 binlog_ignore_db 和 replicate_do_db。如果发现任何此类过滤器,就会出错终止。如果复制配置了任何过滤选项,则应注意不要对存在于主服务器而非复制服务器上的任何数据库或表进行校验。由于过滤选项的原因,对这些表的更改通常会在从库上被跳过,但校验和查询会修改存储校验和的表的内容,而不是要校验数据的表的内容。因此,这些查询将在从库上执行,如果要校验的表或数据库不存在,查询将导致复制失败。复制过滤无法确保校验和查询不会破坏复制(或干脆复制失败)。如果你确定运行校验和查询没有问题,你可以拒绝此选项,禁用校验和查询。另请参阅 --replicate-database.--check-slave-lag指定主从复制延迟大于选项'--max-lag'指定的值之后暂停检查校验操作。默认情况下,工具会检查所有的从库,但该选项只作用于指定的从库(通过DSN连接方式)。--chunk-index指定使用哪个索引对表进行chunk分块操作。默认情况下会选择最优的索引,工具会在SQL语句中添加FORCE INDEX子句。--chunk-index-columns指定使用选项'--chunk-index'的索引使用最左前缀几个索引字段,只适用于复合索引。--chunk-size默认值:1000指定表分块的chunk大小,每个chunk需要校验的表行数,允许的后缀单位为k、M、G。指定了这个选项会覆盖默认动态调整chunk块大小以便在选项'--chunk-time'指定时间内完成行的校验。所以在大多数情况下不建议使用该选项,应该使用选项'--chunk-time'来调整。选择较小的块大小会导致运行速度大大降低,部分原因是--[no]check-plan 需要进行设置工作。--chunk-size-limit默认值:2.0指定chunk的行数最多可以超过选项'--chunk-size'指定的行数的多少倍。当表没有唯一索引时,数据块大小可能不准确。该选项指定了可容忍的最大误差限制。pt-table-checksum 会使用 <EXPLAIN> 来估计数据块中有多少行。如果估计值超过所需的数据块大小乘以限制(默认为两倍),pt-table-checksum 就会跳过该数据块。该选项的最小值是 1,这意味着任何数据块都不能大于--chunk-size。你可能不想指定 1,因为 EXPLAIN 报告的行数是估计值,可能与数据块中的实际行数不同。如果 pt-table-checksum 因为超大而跳过太多数据块,你可能需要指定一个比默认值 2 更大的值。如果指定的值为 0,则可以禁用超大块检查。--chunk-time默认值:0.5动态调整每个chunk的大小使相应的表行数都在指定的时间内完成校验操作。动态调整分块大小,以便每次执行校验和查询都需要这么长的时间。该工具会跟踪所有表和每个表的校验率(每秒行数)。在每次校验和查询后,它都会使用这些速率调整块大小,以便下一次校验和查询的执行时间达到这个长度(以秒为单位)。算法如下:对出对于每个表,根据工具开始运行以来的总体平均每秒行数初始化块大小,如果工具尚未开始运行,则根据 --chunk-size 的值初始化块大小。对于表的每一个后续分块,工具都会调整分块大小,尽量使查询在所需时间内运行。该工具会保持每秒查询次数的指数递减移动平均值,这样,如果服务器的性能因服务器负载的变化而发生变化,该工具也能迅速做出调整。这样,该工具就能为每个表和整个服务器实现可预测的定时查询。如果该选项设置为零,分块大小不会自动调整,因此查询校验时间会变化,但查询校验大小不会变化。做同样事情的另一种方法是明确指定 --chunk-size 的值,而不是让它保持默认值。--columns,-c指定只需要校验的字段,如有多个则用','(逗号)隔开。该选项一般只针对检验一张表时有效,除非有多张表具有相同的字段。--config读取以逗号分隔的配置文件列表;如果指定,必须是命令行的第一个选项。--[no]create-replicate-table默认值:yes创建选项'--replicate'指定的数据库和表。表结构与选项'--replicate'指定的结构相同。--databases -d仅对逗号分隔的数据库列表进行校验--defaults-file -F只读取指定文件中的 mysql 选项。必须给出绝对路径名--[no]empty-replicate-table默认值:yes在对表进行校验和之前,删除每个表之前的校验和。该选项不会截断整个表,它只会在对表进行校验和之前删除每个表的记录(校验和)。因此,如果校验和过早停止,并且存在预先存在的数据,那么在工具停止之前尚未校验和的表行仍会存在。如果从以前的校验和运行中恢复,则不会清空工具恢复的表的校验和记录。要清空整个复制表,必须在运行工具前手动执行 TRUNCATE TABLE。--max-lag默认值:1s暂停校验和,直到所有从库的延迟都小于此值。在每次校验和查询(每个数据块)后,pt-table-checksum 会使用 Seconds_Behind_Master 查看其连接的所有从库的复制延迟。如果任何从库的延迟超过了该选项的值,pt-table-checksum 就会休眠 --check-interval 秒,然后再次检查所有从库。如果指定--check-slave-lag,那么工具只会检查该服务器的延迟情况,而不是所有服务器。如果任何从库悲观,工具会一直等待,直到从库启动。一旦所有从库都开始运行,并且没有严重延迟,校验工作就会继续进行。工具会在等待期间打印进度报告。如果从库停止,它会立即打印进度报告,然后在每个进度报告间隔再次打印。--replicate默认值:percona.checksums指定保存校验结果的表。创建表的结构如下:'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 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,   PRIMARY KEY (db, tbl, chunk),   INDEX ts_db_tbl (ts, db, tbl)) ENGINE=InnoDB DEFAULT CHARSET=utf8;'因为选项'--[no]create-replicate-table'默认值为true,所以默认情况下如果数据库和表之前不存在则会自动创建percona库和checksums表。除非另有选项指定。选项'--replicate'指定的表不会进行校验操作,指定的表默认加入选项'--ignore-tables'。--[no]replicate-check默认值:yes指定在校验完每张表后检查主从当前表是否出现不一致。工具通过连接到从库执行简单的SELECT语句查询校验结果与主库的校验结果进行差异对比,结果显示在输出中的DIFF字段中。--replicate-check-only指定仅仅执行检查主从数据是否一致而不进执行真正的校验操作(主要通过查询之前保留的校验结果)。该选项只适用于同时指定选项'--no-replicate-check'。--replicate-check-retries默认值:1指定当校验出主从数据不一致重试校验的次数。--replicate-database指定工具在执行校验操作时在哪个数据库下进行,相当于执行了语句USE [DB_NAME]。--resume指定从最后完成校验的chunk开始恢复校验。适用于还未完成所有表的校验就工具就中断的情况。--retries默认值:2指定当出现非严重性错误时重复校验一个块的次数。非严重性错误指的是如锁等待超时或长查询被kill的情况。--run-time指定校验操作运行的时间。默认情况需要校验完所有的表数据后停止,可以指定时间单位为:s(秒)、m(分钟)、h(小时)、d(天)。--skip-check-slave-lagDSN类型,可重复使用指定DSN连接从库时跳过主从延迟检查,可以指定多个从库检查。--set-vars默认:    wait_timeout=10000    innodb_lock_wait_timeout=1    lock_wait_timeout=60运行检查时指定参数值,如有多个用','(逗号)分隔。如'--set-vars=wait_timeout=5000'。--[no]empty-replicate-table默认值:yes指定进行当前校验之前删除之前每张表的校验记录。该选项并不是对保存校验结果的表进行truncate,而是在校验每张表之前删除当前表之前的校验结果,因此当校验操作过早停止,则有可能还有表没有校验数据,如果是从之前校验操作恢复,也不会清空保存校验结果的表。如果想清空保存校验结果的表,则在校验操作进行之前手动对表执行truncate操作。--databases,-d指定只需要校验的数据库,如有多个则用','(逗号)隔开。--engines,-e指定只需要校验的指定存储引擎类型的表。--explain指定显示校验查询语句,但不执行真正的校验操作。该选项会禁用选项'--[no]empty-replicate-table',如果指定两次,则工具实际使用的是迭代的chunk算法,打印出每个块的上边界和下边界值,但不执行真正的校验。--fail-on-stopped-replication指定当主从复制停止时,校验中止操作并提示错误而不是等待主从复制恢复之后再进行。--function默认值:CRC32指定校验操作使用的哈希函数。可选函数有SHA1、MD5等。--ignore-columns指定需要忽略校验的字段,如有多个则用','(逗号)隔开。--ignore-databases指定需要忽略校验的数据库,如有多个则用','(逗号)隔开。--ignore-databases-regex指定采用正则表达式匹配忽略校验的数据库。--ignore-engines默认值:FEDERATED,MRG_MyISAM指定需要忽略校验的存储引擎类型的表,如有多个则用','(逗号)隔开。--ignore-tables指定需要忽略校验的表,如有多个则用','(逗号)隔开。表名称可以使用数据库名加以限定。--ignore-tables-regex指定采用正则表达式匹配忽略校验的表。--max-lag默认值:1s指定允许主从复制延迟时长的最大值,单位秒。如果在每次校验查询之后主从延迟超过指定的值,则校验操作将暂停执行,暂停休眠时间为选项'--check-interval'指定的值。待休眠时间结束之后再次检查主从延迟时长,检查方法是通过从库查询的'Seconds_Behind_Master'值来确定。如果主从复制延迟一直大于该参数指定值或者从库停止复制,则操作将一直等待直到从库重新启动并且延迟小于该参数指定值。--progress打印执行过程的进度提示到STDERR。选项值有两部分组成,用逗号进行分隔,第一部分为百分比,时间和迭代。第二部分为根据第一部分数据更新频率,也分为百分比,时间和迭代。--quiet,-q不打印执行过程的信息到STDOUT(禁用'--progress')。但错误和警告还是打印到STDERR。--recurse指定搜寻从库的层级,默认无限级。--recursion-method默认值:processlist,hosts指定获取从库的方式。pt-table-checksum 在执行校验操作时会执行多次 REPLICA CHECKS 操作。pt-table-checksum  运行时候不是必须有从库。以下是可以使用的方法:METHOD       USES===========  =============================================processlist  SHOW PROCESSLIST   hosts        SHOW SLAVE HOSTS   cluster      SHOW STATUS LIKE 'wsrep\_incoming\_addresses'dsn=DSN      DSNs from a tablenone         Do not find slaves==========================================================processlist是默认方法,因为show slave hosts是不可靠的。如果使用的不是标准端口3306,hosts 就成了默认方法。hosts 方法需要配置从库的时候配置了 report_host,report_port 等cluster:基于集群版本Galera 23.7.3及更新版本none:忽略所有的从库和集群节点dsn:通过读取表中从库的DSN信息进行连接。DSN 的配置方式如下:--recursion-method dsn=h=host,D=percona,t=dsns,必须指定D和t部分,或者以D.t格式。DSN表必须有以下的结构:CREATE TABLE `dsns` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `parent_id` int(11) DEFAULT NULL,  `dsn` varchar(255) NOT NULL,  PRIMARY KEY (`id`));--replicate将检查和结果写入到这个表。默认情况下,--create-replicat-table 被设置成true,因此该选项指定的库和表会自动被创建--tables,-t指定只需要校验的表,如有多个则用','(逗号)隔开。表名称可以使用数据库名加以限定。--truncate-replicate-table指定在执行校验操作之前对保存校验结果的表执行truncate操作。注意与选项'--[no]empty-replicate-table'的区分。

 

复制检查

默认情况下,pt-table-checksum 会尝试查找并连接所有与主库相连的从库。这一自动过程称为 "从库递归",由 --recursion-method 和 --recurse 选项控制。会对所有从库执行以下这些检查:

1.--[no]check-replication-filterspt-table-checksum 会检查所有从库上的复制过滤器,因为它们会使校验过程复杂化或中断。默认情况下,如果发现任何复制过滤器,工具就会退出,但可以通过指定 --no-check-replication-filters 来禁用这种检查。2.--replicate tablept-table-checksum 会检查 --replicate 表是否在所有从库上都存在,否则当主库上的表更新复制到没有该表的从库时,校验和会破坏复制。该检查无法禁用,会一直等待,直到表在所有从库上都存在,并在等待时打印 --progress 信息。3.Single chunk size如果一个表可以在主库上以单块大小进行校验,pt-table-checksum 将检查所有从库上小于 --chunk-size * --chunk-size-limit 的表。这可以防止出现主库上的表为空或很小,但从库上的表却大得多的罕见问题。在这种情况下,主库上的单块校验和会使从库超载。另一个罕见的问题发生在从库上的表大小接近 --chunk-size * --chunk-size-limit 时。在这种情况下,即使在单块中进行校验是安全的,表也更有可能被跳过。出现这种情况是因为表的大小是估计值。当这些估计值和 --chunk-size * --chunk-size-limit 几乎相等时,校验就会对估计值的误差范围更敏感,而不是对表大小的实际显著差异更敏感。为 --chunk-size-limit 指定一个较大的值有助于避免这个问题。此检查不能禁用。4.Lag每个数据块之后,pt-table-checksum 都会检查所有从库的延迟情况,或者只检查 --check-slave-lag 指定的从库。没有办法禁用这种检查,但你可以用 --check-slave-lag 指定检查单个从库。5.Checksum chunkspt-table-checksum完成对表的校验后,会等待最后一个校验和块复制到所有从库,以便执行--[no]replicate-check。通过指定--no-replicate-check 来禁用该选项可以禁用这种检查,但同时也会禁用立即报告校验和差异的功能,因此需要使用--replicate-check-only 来再次运行该工具,以发现并打印校验和差异。