使用 percona 工具检查主从不一致
可以使用 pt-table-checksum 工具检查主从数据的一致性,检查完之后默认会生成一个 percona 库以及一个 checksums 表,记录了当前实例和主库对比的结果。表结构如下:
主要关注的是 this_crc和master_crc 的值,和this_cnt、master_cnt 这两对参数的值是否一致,若不一致说明主从之间有不一致的数据。
下面简单看一下 pt-table-checksum 工具的用法:
pt-table-checksum h='192.168.0.45',u='root',p='115433',P=19102, --nocheck-binlog-format --recursion-method=processlist --nocheck-replication-filters --databases=test[DSN] 指定主库的登录方式,包括ip,用户名,密码,端口等选项
--recursion-method 参数有四:processlist/hosts/dsn=DSN/no,默认是processlist,hosts,但最好还是指定一下,建议指定--recursion-method=processlist,no一般不使用
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--max-lag 默认1S,主从最大延迟,超过这个延迟时间,就会停下来等待从库同步,确定方法是采用Seconds_Behind_Master的值
--no-check-binlog-format : 不检测日志格式。这个选项对于 ROW 模式的复制很重要,因为pt-table-checksum会在 Master和Slave 上设置binlog_format=STATEMENT(确保从库也会执行 checksum SQL),
MySQL限制从库是无法设置的,所以假如行复制从库,再作为主库复制出新从库时(A->B->C),B的checksums数据将无法传输
--replicate= :把checksum的信息写入到指定表中,如果没有指定,默认是 percona.checksums ;建议直接写到被检查的数据库当中,若不指定,生成一个 percona库,建立checksums表
--databases=,-d :要检查的数据库,逗号分隔;--databases-regex 正则匹配要检测的数据库,--ignore-databases[-regex]忽略检查的库。
--tables=,-t :要检查的表,逗号分隔。如果要检查的表分布在不同的db中,可以用--tables=dbname1.table1,dbnamd2.table2的形式 --ignore-tables
--create-replicate-table 选项会自动创建 percona.checksums 表 需要建表权限
--empty-replicate-table:每个表checksum开始前,清空它之前的检测数据(不影响其它表的checksum数据),默认yes
--resume 如果主从一致性检查中途中断的话,可以用这个参数来使工具从上次中断时检查的最后一个表开始继续检查