我已经设置了MySQL复制,一主一从。现在我开始使用 Percona 的pt-table-checksum
. 检测从站上的任何变化或漂移的绝佳工具。
据我从其文档中了解到,它在主服务器上运行,将校验和写入percona.checksums
表,并在使用常规远程 MySQL 连接连接(自动检测)的从服务器上类似地运行。但是,percona.checksums
表实际上也被复制了!如果从站上的数据不同,则来自主站的校验和可能会在从站上被覆盖而不会被检测到。
现在,我担心这可能会导致我在检测变化时观察到的假阴性。
是否pt-table-checksum
采取了预防措施来防止percona.checksums
桌面上的复制?
- 如果是这样,这是如何工作的?(据我所知,不能像这样更改复制过滤器)这可能有助于我查明我的观察的其他原因(见下文)。
- 如果不是,那么我如何确定该表的内容反映了该特定服务器的校验和?我应该放置一个复制过滤器吗?Percona 的工具包文档实际上不鼓励这样做。
实际观察
我在我的测试设置中看到了一个事件,其中以某种方式运行pt-table-checksum
没有检测到故意对从站进行的更改。检查校验和表的内容显示了主人的校验和。在从站本身上运行该工具然后显示校验和应该是不同的!这让我相信存在竞争条件,这也是难以重现的原因。
另一个假设
假设 slave 在运行的时候发生了漂移,网络连接中断了一小会儿pt-table-checksum
。它会在输出中显示它无法连接到从站stderr
,但不会失败。不久之后,网络恢复,复制恢复,复制主表的内容percona.checksums
。然后运行pt-table-checksum --replicate-check-only
, 将提供漏报。我在这里吗?如果是这样,在这种情况下我该如何防止这种情况发生?
这是一个常规的 MySQL 服务器/客户端,使用 Percona 的工具包。
版本:
- pt表校验和2.1.4
- MySQL客户端:5.5.24
- MySQL 服务器:5.5.24-0ubuntu0.12.04.1-log (Ubuntu 12.04)
你错了。它只在主服务器上运行校验和,不在从服务器上运行。
示例查询运行:
这是有效的,因为它需要基于语句的复制,所以查询是在每个从站上针对他们的数据而不是主站找到的数据运行的。这记录在限制下的 pt-table-checksums 文档中
如果您在校验和查询复制后修改数据,当然不会显示数据已更改,因为在计算校验和时它是正确的。
如果您在更改从站上的数据后重新运行校验和,那么它应该会拾取它,假设您没有使用 n>2 层复制设置。
回复:另一个假设,没关系,与奴隶的连接只对不匹配的“实时”检测很重要,而不是校验和实际计算正确。即使在网络中断的情况下,也不应该出现漏报。
说得通?