pt-table-checksum使用说明

来源:互联网 发布:java怎么上传文件 编辑:程序博客网 时间:2024/05/18 00:06
功能:

pt-table-checksum是一个在线验证主从数据一致性的工具,主要用于以下场景:
  • 数据迁移前后,进行数据一致性检查 
  • 当主从复制出现问题,待修复完成后,对主从数据进行一致性检查 
  • 把从库当成主库,进行数据更新,产生了"脏数据" 
  • 定期校验 
原理说明:

 pt-table-checksum 在主上执行检查语句在线检查 mysql 复制的一致性,生成 replace 语句,然后通过复制传递到从,再通过update 更新 master_src 的值。 通过检测从上 this_src 和 master_src 的值从而判断复制是否一致。
注意: 使用的时候选择业务地峰的时候运行,因为运行的时候会造成表的部分记录锁定。
使用--max-load 来指定最大的负载情况,如果达到那个负载这个暂停运行。如果发现有不一致的数据,可以使用pt-table-sync 工具来修复。
注意: 和 1.0 版本不同,新版本的 pt-table-checksum 只需要在 master上执行即可。
通过 –explain 参数再结合二进制日志就可以看出脚本的工作原理,如我的 test 库有一个名字为 zhang 的表,我们通过抓取二进制日志来 查看脚本的原理:
REPLACE INTO `test`.`checksums` (db, tbl, chunk, chunk_index, lowe
r_boundary, upper_boundary, this_cnt, this_crc) 
 SELECT 'test', 'zhan
g', '1', NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CON
V(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `id`, `name`, CONCAT(ISNULL
(`name`)))) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `test`.`zhang`

/*checksum table*/;
UPDATE `test`.`checksums` SET chunk_time = '0.000563', master_crc
= '31012777', master_cnt = '4' WHERE db = 'test' AND tbl = 'zha
ng' AND chunk = '1'

从这里可以很明显的看出原理了,前面已经说了,这里就不赘述了。

执行:在主库上执行

使用示例
相关参数说明:
参数
说明
--nocheck-replication
忽略replication-do-db规则
--no-check-binlog-format不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate
选择哪个库下创建checksums表,并将数据写入到表中
 --ignore-tables
忽略某张表
--replicate-check-only
结果只显示数据不一致的表
--create-replicate-table 
首次运行时需要添加,创建checksum表,若不指定需要手动创建表,语句见附

附:
CREATE TABLE checksums (
db char(64) NOT NULL,
tbl char(64) NOT NULL,
chunk int NOT NULL,
chunk_time float NULL,
chunk_index varchar(200) NULL,
lower_boundary text NULL,
upper_boundary text NULL,
this_crc char(40) NOT NULL,
this_cnt int NOT NULL,
master_crc char(40) NULL,
master_cnt int NULL,
ts timestamp NOT NULL,
PRIMARY KEY (db, tbl, chunk),
INDEX ts_db_tbl (ts, db, tbl)
) ENGINE=InnoDB;

显示说明:

字段
说明
 TS 
完成检查的时间
ERRORS
检查时候发生错误和警告的数量
DIFFS
0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS
表的行数。
CHUNKS
被划分到表中的块的数目
SKIPPED
由于错误或警告或过大,则跳过块的数目。
TIME
执行的时间
TABLE
被检查的表名。

示例一:比较两个数据库同步是否一致

pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --host=192.168.153.132 --user=admin --password=123456 --port=3306 --no-check-binlog-format



说明:使用这个命令可以对比两个库中哪些表的数据不一致,如果DIFFS为非0,则表示两表的数据不致。

示例二:比较两个库是否同步,结果只显示数据不一致的表。

pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --host=192.168.153.132 --user=admin --password=123456 --port=3306 --no-check-binlog-format  --replicate-check-only 

0 0
原创粉丝点击