MySQL主从不一致检查与修复
pt-table-checksum在主上执行检查语句在线检查mysql复制的一致性,把表分块(hunk-size),生成replace语句,然后通过复制传递到从,
pt-table-checksum 安装:
下载地址:wget
tar xf percona-toolkit-{version}.tar.gz
cd percona-toolkit-{version} # 进入解压后的目录
vim README # 查看安装手册
必备条件:
安装 yum install perl mysql perl-DBD-MySQL -y
pt-table-checksum安装步骤:
perl
Makefile.PL
make
make install
一、在master上操作:
1.在Master库上授权:
GRANT update,insert,delete,SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO checksum@'Master ip' IDENTIFIED BY '123' ;
2、手工建在制定的库下(例如pts) checksums 表,保存pt-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;
a.执行pt-table-checksum 检查主从数据表:
/usr/bin/pt-table-checksum h='1.1.1.2',u='checksum',p='123',P=3306 --databases test --tables t --nocheck-replication-filters --create-replicate-table --replicate=pts.checksums --no-check-binlog-format --lock-wait-timeout=120
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
06-08T10:41:16 0 0 2 1 0 0.338 test.t
上面显示的参数说明:
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
b.执行pt-table-sync 打印主从数据不一致的表:
/usr/bin/pt-table-sync --replicate=pts.checksums h=1.1.1.2,u=checksum,p=123 h=1.1.1.4,u=checksum,p=123 --print
c.恢复主从不一致的数据(在Master执行且以Master的结果为准)
/usr/bin/pt-table-sync --replicate=pts.checksums h=1.1.1.2,u=checksum,p=123 h=1.1.1.4,u=checksum,p=123 --execute
pt-table-checksum是一个在线验证主从数据一致性的工具,主要用于以下场景:
1. 数据迁移前后,进行数据一致性检查
2. 当主从复制出现问题,待修复完成后,对主从数据进行一致性检查
3. 把从库当成主库,进行数据更新,产生了”脏数据”
4. 定期校验
工作原理:
pt-table-checksum在主上执行检查语句在线检查mysql复制的一致性,把表分块(hunk-size),生成replace语句,然后通过复制传递到从,再通过update更新master_src的值。通过检测从上this_src和master_src的值从而判断复制是否一致。
下一篇: PHP截断包含汉字不发作乱码的方法