暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

pt-table-checksum校验原理及使用

原创 鸿惊九天 2022-11-20
1962
pt-table-checksum是percona-toolkit系列工具中的一个,可以用来检测主、从数据库中数据的一致性。通过开启general_log观察主从库的动作,可以得知:
1.连接主库和从库,查询当前数据库服务器信息,包括参数设置,负载信息等;
2.根据工具选项设置会话级别参数,设置会话级binlog row format为STATEMENT;
3.根据工具选项创建校验结果表(默认为percona.checksums表),查看当前数据库服务器运行状态;
4.获取校验的数据库和表,逐张顺序进行检查校验;
5.开始分析表,根据表的索引(如有),将表分成多个chunk,每个chunk包含多行,默认为1000,chunk对应的表行数可以根据数据库性能状态动态调整;
6.根据以上分析生成表的校验语句,并检查表结构;
7.开始进行表的校验分析,为了保证一致性,这个阶段会将当前chuck所包含的行加上行锁,并将校验的结果以replace into方式存入校验结果表;
8.再次查询校验结果表,并更新master_crc、master_cnt的值(主库),如果是从库则是this_crc、this_cnt;
9.根据数据库运行状态调整下一个chunk所包含行数;
10.继续下一个chunk的校验检查,直到表中所有的chunk校验完成;
11.从库运行完校验检查,汇总这张表的结果;
12.循环完成所有需要校验的表直到完成所有的表的校验操作。


注意:
如果主库使用的是默认端口,那么--recursion-method默认值为processlist,这时pt-table-checksum只能连上端口为3306的从库,无法连接非默认端口的从库.
如果主库使用非默认端口,--recursion-method默认值为hosts,这时如果从库没有配置report_host参数(注意该参数缺点),则pt-table-checksum无法自动检测到从库。

hosts方式查找从库信息:

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|     33073 |      | 3307 |     33071 | 3eac0871-f6c7-11ec-9142-000c290c7af7 |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)


当使用show slave hosts命令时,有可能看不到从库的ip信息,获取不到信息当然就不能连上从库了。这种情况需要在从库的/etc/my.cnf配置文件中加入参数:从库的ip和端口

report_host=10.10.10.152
report_port=3307

修改参数后重启从库再看看:发现从库的信息已经有了

mysql> show slave hosts;
+-----------+--------------+------+-----------+--------------------------------------+
| Server_id | Host         | Port | Master_id | Slave_UUID                           |
+-----------+--------------+------+-----------+--------------------------------------+
|     33073 | 10.10.10.152 | 3307 |     33071 | 3eac0871-f6c7-11ec-9142-000c290c7af7 |
+-----------+--------------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)

# pt-table-checksum h=10.10.10.150,u=root,p='rootmysql',P=3307 --databases=test002 --tables=std01 --nocheck-replication-filters --no-check-binlog-format

--no-check-replication-filters 表示不需要检查 Master 配置里是否指定了 Filter。 默认会检查如果配置了 Filter,如 replicate_do_db,replicate-wild-ignore-table,binlog_ignore_db 等,在从库checksum就与遇到表不存在而报错退出,所以官方默认是yes(--check-replication-filters)但我们实际在检测中时指定--databases=,所以就不存在这个问题,干脆不检测。
--no-check-binlog-format 不对binlog的格式进行检查
--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--replicate-check-only 只显示主从不一致部分,此参数不会生成新的checksums数据,只会根据checksums表已经有的数据来显示




结果说明:

ERRORS` :检查时候发生错误和警告的数量。

`DIFFS`:0表示一致,1表示不一致。

当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。`

ROWS` :表的行数。

`CHUNKS` :被划分到表中的块的数目。

`SKIPPED` :由于错误或警告或过大,则跳过块的数目。

`TIME` :执行的时间。

`TABLE` :被检查的表名。



如果如果主库或者从库使用了非默认端口,建议通过dsn指定从库信息,步骤如下:

在主库创建dsn表,并插入从库信息
CREATE TABLE db_hxl.`dsns` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`dsn` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);

insert into db_hxl.dsns select 1,1,'h=192.168.1.135,u=admin,p=mysql,P=13306';

pt-table-checksum --socket=/opt/mysql5727/mysql.sock --no-check-binlog-format --nocheck-replication-filters --replicate=db_hxl.checksums --tables=db_hxl.tb_test h=192.168.1.134,u=admin,p=mysql,P=13306 --recursion-method=dsn=h=192.168.1.134,D=db_hxl,t=dsns

Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
12-30T11:27:40 0 1 7 0 1 0 0.149 db_hxl.tb_test

1) 只检查指定数据库下所有表
pt-table-checksum --nocheck-binlog-format--replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns--set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--databases=test1,test5 --quiet

2) 只检查指定表
pt-table-checksum --nocheck-binlog-format--replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns--set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--databases=test1 --tables=test_concat --quiet
或者--tables=database.table
pt-table-checksum --nocheck-binlog-format--replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns--set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--tables=test1.test_concat –quiet
或者--tables-regex正则匹配指定表
pt-table-checksum --nocheck-binlog-format--replicate=percona.checksums --recursion-method=dsn=D=percona,t=dsns--set-vars innodb_lock_wait_timeout=120 -uroot -proot -h127.0.0.1 -P3306--databases=test1 --tables-regex=test_*


主从在不同机器同一端口下,在主库上执行
/pt-table-checksum --recursion-method="processlist" --nocheck-binlog-format --nocheck-replication-filters --replicate=db_hxl.checksums --databases=db_hxl --tables=tb_test h=192.168.1.134,u=admin,p=mysql,P=13306



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论