背景:
我们现在需要对线上主库(简称A)6个备库中的某个库(简称B)做数据校验;
方式:pt-table-checksum工具
<1> 第一步需要配置dsns,这样可以指定备库校验
在A库上某个库中:
CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) );
INSERT INTO dsns (parent_id,dsn) values(1, "h=B,u=root,p=******,P=****");
<2> 第二步设定校验脚本
--databases #这个是指定库 --max-lag=10 #指定库的延迟数 最大不要超过多少 --nocheck-replication-filters # --no-check-binlog-format #忽略binlog模式 --ignore-tables # 忽略校验的表 --recursion-method=dsn=h=B,D=***,t=dsns #dsns模式下 --chunk-size #默认1000,可以修改低点
执行如下:
pt-table-checksum h='A',u='****',p='******',P=3306 --databases=*** --max-lag=10 --nocheck-replication-filters --no-check-binlog-format --replicate=***.checksums --ignore-tables=album_useralbum,album_photoexif --recursion-method=dsn=h=B,D=***,t=dsns 1>>/tmp/checksum_1.log 2>>/tmp/checksum_1.log
主库error.log:
160111 23:03:11 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave. Statement: REPLACE INTO `***`.`checksums` (db, tbl, chunk, chunk_index, lower_bo undary, upper_boundary, this_cnt, this_crc) SELECT 'qyer', 'plan_onedayevent_h_15', '11', 'PRIMARY', '138128303', '150253579', COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `id`, ` plan_id`, `uid`, `play_time`, `typeid`, `catetypeid`, `pid`, `title`, `type`, `badword_level`, `oneday_id`, `badword`, `starthours`, `startminutes`, `endhours`, `endminutes`, `budgetid`, `textsids`, `hav_c ron`, `addtime`, `updatetime`, `coord`, `address`, `rafill_reason`, `pid_old`, ……
问题: a. 执行的时候B库延迟可以严格控制在指定的范围内,但其他库延迟会很大;
b. 想着考虑让其他的库忽略复制checksums表,但改忽略复制表需要重启库;
c. 因为我们的binlog模式是mixed,所以主库error.log会报一堆错
-- 王老虎
本文出自 “王老虎” 博客,转载请与作者联系!