1. 概述
pt-table-checksum 是 Percona-Toolkit 的组件之一,用于检测 MySQL 主、从库的数据是否一致。其原理是在主库执行基于 statement 的 SQL 语句来生成主库数据块的checksum,把相同的 SQL 语句传递到从库执行,并在从库上计算相同数据块的 checksum,最后,比较主从库上相同数据块的 checksum 值,由此判断主从数据是否一致。它能在非常大的表上工作的一个原因是,它把每个表分成行块,并检查每个块与单个替换。选择查询。它改变块的大小,使校验和查询在所需的时间内运行。分块表的目的是确保校验和不受干扰,并且不会在服务器上造成太多复制延迟或负载,而不是使用单个大查询处理每个表。这就是为什么默认情况下每个块的目标时间是 0.5 秒。
2. 场景
pt-table-checksum 默认情况下可以应对绝对部分场景,官方说,即使上千个库、上万亿的行,它依然可以很好的工作,这源自于设计很简单,一次检查⼀个表,不需要太多的内存和多余的操作;必要时,pt-table-checksum 会根据服务器负载动态改变 chunk 大小,减少从库的延迟。
为了减少对数据库的干预,pt-table-checksum 还会⾃动侦测并连接到从库,当然如果失败,可以指定 --recursion-method 选项来告诉从库在哪里。它的易用性还体现在,复制若有延迟,在从库 checksum 会暂停直到赶上主库的计算时间点(也通过选项 -- 设定一个可容忍的延迟最大值,超过这个值也认为不一致)。
3. 保障措施
pt-table-checksum 有许多其他的安全措施,以确保它不会⼲扰任何服务器的操作,包括副本。为了做到这⼀点,pt-table-checksum 检测副本并⾃动连接到它们。(如果失败,可以使⽤递归⽅法选项给它⼀个提示。)
该工具持续监控副本。如果任何副本在复制过程中远远落后,pt 表校验和会暂停以使其赶上来。如果任何副本有错误,或者复制停止,pt-table 校验和将暂停并等待。此外,pt-table-checksum 查找问题的常见原因,比如复制过滤器,并且拒绝操作,除⾮您强迫它这样做。复制筛选器是危险的,因为 pt-table-checksum 执行的查询可能与它们发生冲突,并导致复制失败。
pt-table 校验和验证块是否太大而不能安全校验和。它对每个块执行解释查询,并跳过可能大于所需行数的块。您可以使用 --chunk-size-limit 选项配置此保护措施的敏感性。如果一个表因为行数少而要在单个块中对其进行校验,那么 pt-table-checksum 将额外验证该表在副本上是否过大。这避免了以下场景:表在主服务器上是空的,但在副本上非常大,并且在一个大型查询中进行检查,这会导致复制过程中出现非常长的延迟。
还有⼀些其他的保障措施。例如,pt-table-checksum 将它的会话级 innodb_lock_wait_timeout 设置为 1 秒,这样,如果存在锁等待,它将成为受害者,而不是导致其他查询超时。另一个安全措施检查数据库服务器上的负载,如果负载过高则暂停。对于如何做到这一点,没有一个正确的答案,但是默认情况下,如果有超过 25 个并发执行的查询,pt-table-checksum 将暂停。您可能应该使用 --max-load 选项为服务器设置一个合理的值。
校验和通常是一个低优先级的任务,应该让位给服务器上的其他⼯作。然而,一个必须经常重启的共工具是很难使用的。因此,pt 表校验和对错误具有很强的弹性。例如,如果数据库管理员出于任何原因需要杀死 pt-table-checksum 的查询,这就不是一个致命错误。⽤户经常运行 pt-kill 来终止任何长时间运行的校验和查询。该工具将重试一次已杀死的查询,如果再次失败,它将移动到该表的下一个块。如果存在锁等待超时,则应用相同的行为。如果发生这样的错误,工具将打印一个警告,但每个表只打印一次。如果到任何服务器的连接失败,pt-table-checksum 将尝试重新连接并继续⼯作。
4. 操作步骤
1. 创建主从架构
安装 mysql(略)