pt-table-checksum是Percona Toolkit工具系列中的一个,可以用来检测MySQL主、从数据的一致性。
其原理是,在主库执行校验语句(binlog格式为STATEMENT),通过复制传递到从库,如果数据不一致,则主、从会产生不同的校验值,以此来判断主从数据是否一致。
--resume
CTRL-C
binlog_format=STATEMENT
binlog_format
--[no]check-binlog-format
https://www.percona.com/doc/percona-toolkit/3.0/pt-table-checksum.html#options
pt-table-checksum -upt_table_check -p123 -S mysql.sock --tables=liulin.t1 --no-check-binlog-format --replicate=percona_schema.checksums --recursion-method=hosts
注意1:-u :用户命令 -p 用户密码 -->这里最好在主库创建创建一个用户,然后通过主从复制同步到各个从库中
注意2: --replicate 参数表示在主库和从库下的percona_schema库下创建一张checksums表,该表很重要,一般是在我们执行完命令后,通过主从库的这张表进行验证主从库数据是否一致
注意3: --recursion-method=hosts :这个参数表示主库通过hosts连接和认证从库,注意当开启这个参数时,必须要在从库中配置:report_host参数和report_port参数,填写当前数据库的ip地址和端口号
pt-table-checksum的输出有两种格式:带--replicate-check-only
参数和正常不带这个参数时,输出结果的格式是不同的。
--replicate-check-only 参数输出
pt-table-checksum在完成校验后会以表格形式输出结果,每个表的校验结果为一行输出,每完成校验一张表会输出一行校验结果。
输出格式如下:
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 09-12T10:34:38 0 0 1 1 0 0.059 road_to_dba.names 09-12T10:34:38 0 0 5 1 0 0.016 road_to_dba.t_bigint
各列的含义如下:
--no-replicate-check
--replicate-check-only
--chunk-index
--[no]check-plan
--chunk-size * --chunk-size-limit
--retries
--retries
--replicate-check-only 输出
如果指定了--replicate-check-only
参数,则只会输出校验结果不一致的从库数据。
输出结果的格式为:每一个从库为一个段落,每一个校验结果不同的分块占一行,各列值之间以空格分隔。如下
Differences on node601 TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY road_to_dba.tbl1 1 0 1 PRIMARY 1 100 road_to_dba.tbl1 6 0 1 PRIMARY 501 600 Differences on node603 TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY road_to_dba.tbl1 1 0 1 PRIMARY 1 100 road_to_dba.tbl2 9 5 0 PRIMARY 101 200
输出的每个段落的第一行表示校验结果与主库不一致的从库的信息。
各列的含义如下:
从库的分块的行数量
主库的分块的行数量
在主库上执行
校验表road_to_dba.t_int主从数据的一致性:
shell> ./bin/pt-table-checksum --socket=/tmp/mysql3376.sock --user=pt_table_check --password=‘checksum123‘ --tables=road_to_dba.t_int --no-check-binlog-format --replicate=percona_schema.checksums
结果:
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 09-19T18:50:19 0 1 9 1 0 0.042 road_to_dba.t_int
可以从DIFFS列看出有一个数据分块的主从数据不一致
在从库执行
mysql> SELECT * FROM percona_schema.checksums WHERE master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc); +-------------+-------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+ | db | tbl | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts | +-------------+-------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+ | road_to_dba | t_int | 1 | 0.000546 | NULL | NULL | NULL | 2e1ed7d3 | 10 | 17818634 | 9 | 2016-09-19 18:50:19 | +-------------+-------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+ 1 row in set (0.00 sec)
从以上查询可以看出:
表road_to_dba.t_int的
分块1
的主从数据不一致。该分块在主库的行数(master_cnt
)为9
,在从库的行数(this_cnt
)为10
;该分块在主库的校验值(master_crc
)为17818634
,在从库的校验值(this_crc
)为2e1ed7d3
;
转载于:https://www.modb.pro/db/56033
原文:https://www.cnblogs.com/zmc60/p/15059567.html