根据[文档](https://www.percona.com/doc/percona-toolkit/LATEST/pt-table-checksum.html),**pt-table-checksum**是一种通过在主服务器上执行校验和查询,来检查在线复制的一致性工具,这会在与主服务器不一致的slave上产生不同的结果。
主设备和每个从设备将校验和插入**percona.checksums**表中,稍后将对这些差异进行比较。很明显,校验和需要在每个节点上独立确定,因此这些插入必须复制为STATEMENT而不是ROW 。否则,从设备只会插入与主设备相同的校验和,而不是独立计算。
该工具只需要在自己的会话设置**binlog_format = STATEMENT**。它在master上设置,但如果尚未在每个从节点上设置它,则会出错。出现错误的原因是更改会话binlog_format的语句将不会被复制。因此,如果一个从属设备**binlog_format=ROW** ,则从设备本身将正确执行校验和,但结果将被写为ROW。链中该奴隶的任何从属将只插入相同的结果。请参阅错误[899415](https://bugs.launchpad.net/percona-toolkit/+bug/899415)。
这只是一个问题,如果我们有链式复制,并且可以跳过错误,**--no-check-binlog-format** 因此对于使用ROW或MIXED复制的简单复制设置,我们仍然可以使用该工具。如果我们没有**slave-of-slave**样式链式拓扑,那么就不必担心这个问题。
但是,如果您正在使用复制过滤器,则需要注意一点:当从属设备未复制特定数据库时**binlog-ignore-db**,此设置与基于ROW的复制(RBR)与基于STATEMENT的行为不同。
####根据文档,使用RBR####
binlog-ignore-db=testing
将导致testing库的所有更新被跳过。对于基于STATEMENT的复制,它将导致忽略USE testing;之后的所有更新(不管更新被写到哪里)。
**pt-table-checksum以下列方式运行:**
use `testing`/*!*/;
SET TIMESTAMP=1541583280/*!*/;
REPLACE INTO `percona`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary,this_cnt, this_crc) SELECT ‘testing', 'testing', '1', NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `id`, CONCAT(ISNULL(`id`)))) AS UNSIGNED)), 10, 16)),0) AS crc FROM `testing`.`testing` /*checksum table*/
由于use testing slave会在没有错误的情况下跳过这些语句,而只是不写入**percona.checksums**。
根据文档:
该工具不断监视副本。如果任何副本在复制中落后太多,pt-table-checksum会暂停以允许它赶上。如果任何副本有错误或复制停止,pt-table-checksum会暂停并等待。
在这种情况下,您将看到该工具不断等待,具有以下调试输出:
# pt_table_checksum:12398 10967 SELECT MAX(chunk) FROM `percona`.`checksums` WHERE db=‘testing’ AND tbl=‘testing’ AND master_crc IS NOT NULL
# pt_table_checksum:12416 10967 Getting last checksum on slave1
# pt_table_checksum:12419 10967 slave1 max chunk: undef
# pt_table_checksum:12472 10967 Sleep 0.25 waiting for chunks
# pt_table_checksum:12416 10967 Getting last checksum on slave1
# pt_table_checksum:12419 10967 slave1 max chunk: undef
# pt_table_checksum:12472 10967 Sleep 0.5 waiting for chunks
# pt_table_checksum:12416 10967 Getting last checksum on slave1
# pt_table_checksum:12419 10967 slave1 max chunk: undef
我们不建议使用具有复制过滤器的工具,但如果**--no-check-replication-filters**已指定,则应了解不同binlog格式处理这些过滤器的方式的差异。
####一种解决方法是更换####
binlog-ignore-db=testing
####使用以下内容将忽略对该数据库的写入:####
binlog-wild-ignore-table=testing.%
原文地址:[https://www.percona.com/blog/2018/11/22/caveats-pt-table-checksum-using-row-based-replication-and-filters/](https://www.percona.com/blog/2018/11/22/caveats-pt-table-checksum-using-row-based-replication-and-filters/)
文章最后更新时间:
2018年11月23日 00:32:56