延迟正常数据却对不上|pt-table-checksum查出主从不一致

简介: 从对账时两边总额对不上、延迟却正常切入,把主从不一致的根因分为四类,讲清 pt-table-checksum 的分片校验、限流与定位,以及 pt-table-sync 的安全修复边界。

大家好,我是数据库小学妹👋 我踩过的坑,你别再踩。

有一次对账,两边总额差了一笔。我先怀疑是数据出错,翻了半天流水,主库那笔是好端端的。问题不在主库,在从库:同一个订单号,从库读出来的状态,跟主库写进去的不是一回事。奇怪的是,主从延迟曲线一直很平,SHOW SLAVE STATUS 也没报错。延迟没红,数据却早就对不上了。我盯了那么久的那个指标,根本没看住这件事。

后面我才搞懂,「同步得上」和「数据对得上」,本来就是两回事。前者是性能,后者是正确性。延迟正常,不代表数据一样。今天这篇就把我在这上面踩过的坑分享出来,希望帮你少走弯路少踩坑。

不一致从哪来

知道了它会发生,接下来就得问:好端端的复制,怎么会跑歪。主从不一致,常见四个源头。

第一类,非确定性语句。STATEMENT 格式存的是 SQL 原文。从库要把它重放一遍,函数就在从库上重新求值。UUID()、RAND() 每次结果都不同,主从自然不一样。最容易被误会的是 SYSDATE()。很多人以为它跟 NOW() 一样。其实 NOW() 会被 binlog 里的 SET TIMESTAMP 固定住,重放时值一致。SYSDATE() 不认这个,取的是从库的真实时间,主从就会差。还有 LIMIT 不带 ORDER BY,取哪几行全凭引擎顺序,主从各取各的。

第二类,GTID 空洞。复制报错时,为了尽快恢复,很多人会用 sql_slave_skip_counter 跳过那笔事务。跳过的代价,是从库的 GTID 集合里少了一条,数据永远缺着。它的隐蔽在于,跳完之后复制继续跑,SHOW SLAVE STATUS 一切正常。如果你不去比对数据,根本不知道会少了这一笔。

第三类,并行复制冲突。MySQL 开了多线程复制(slave_parallel_workers > 0),主库提交的一组事务,从库按依赖关系并行回放。顺序一旦和主库不一样,比如两笔交易交叉写了同一行,从库的 SQL 线程就会停住报错。常见的是 1062(Duplicate entry)和 1032(Cannot find record),背后多半就是回放顺序对不上。5.7 的 LOGICAL_CLOCK 和 8.0 的 WRITESET 都在改善,但冲突窗口没法完全关死。

第四类,手工改从库。从库没开 super_read_only,有人上去直接改数据。改完复制继续跑,没人报警。

校验:pt-table-checksum 怎么用

四个源头,有的能提前防,有的只能事后抓。但不管你怀疑哪一个,第一步都一样,先确认到底哪里不一致。我用的工具是 pt-table-checksum,Percona Toolkit 里的分片校验工具。

它的工作原理是这样的。工具连上主库,把每张表切成若干 chunk,对每个 chunk 计算 CRC32 校验和。这个校验和通过 binlog 复制到从库,从库也存一份同样的结果。然后工具去从库查那份校验表,把主库和从库的 CRC 逐 chunk 对比。不一样的那个 chunk,就是数据不一样的地方。

# 在主库上跑,把结果写进 percona.checksums 表
pt-table-checksum \
  --replicate=percona.checksums \
  --databases=app \
  --chunk-size=1000 \
  --sleep=0.1 \
  h=master_host,u=checksum_user,p=xxx

两个参数要盯紧。--chunk-size 是每次校验的行数,太大拖库,太小切太多片。一般一千到五千,看表大小。--sleep 是每次 chunk 之间的间隔秒数,给主库喘口气。别在高峰跑,或者 --sleep 设大点。

还有一个自动限流的参数,--max-load,很容易被漏掉。它盯的是活跃线程数(Threads_running),默认超过 25 就自动暂停,等压力降下来再接着跑。这才是真正的兜底——前面两个参数是你自己估出来的,它是盯着主库的实时水位动态刹车。

跑完之后,它会给一份输出。关键看 DIFFS 列。

         TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
10-15T14:20:00      0      1  2345678         0     234       0  123.4 app.t_order
10-15T14:20:05      0      0   123456         0      12       0   5.6 app.t_user

(输出格式为示意,实机以 Percona Toolkit 实际输出为准。)

DIFFS 非零,说明这张表的至少一个 chunk 在主从两边不一致。上面 t_order 的 DIFFS = 1,就是不一致。

这里有个前提别忘了。校验和是先在主库算好,再靠 binlog 传到从库去比对的。也就是说,复制本身得是通的。要是复制已经停了、卡着,工具拿到的比对也会失真。所以别拿校验去判断复制通不通,那个因果是反的。

定位:从差异到具体行

知道哪张表有问题了,下一步是找具体差在哪。去从库查校验表。

-- 从库上查:哪些 chunk 的 CRC 对不上
SELECT db, tbl, chunk, master_cnt, this_cnt, master_crc, this_crc
FROM percona.checksums
WHERE master_crc <> this_crc
  AND this_crc IS NOT NULL;

拿到 db、tbl、chunk 之后,就知道是哪块分片出了问题。要看到底差哪行,有两种办法。一是把主从两边的这个 chunk 分别导出来 diff。二是用 pt-table-sync 加 --print 预览,看它打算生成哪些 corrective 语句。

# pt-table-sync 预览:它会输出在主库上执行的 corrective SQL
pt-table-sync \
  --print \
  --replicate=percona.checksums \
  h=master_host,u=sync_user,p=xxx \
  h=replica_host,u=sync_user,p=xxx

注意:--print 只打印,不执行。先看清它要改什么,再决定下一步。

修复:pt-table-sync 的安全边界

pt-table-sync 能自动把从库拉回和主库一致。但它是个危险操作,用错了会雪上加霜。

# 确认无误后执行修复(必须在主库上跑,变更通过 binlog 传播到从库)
pt-table-sync \
  --execute \
  --replicate=percona.checksums \
  h=master_host,u=sync_user,p=xxx \
  h=replica_host,u=sync_user,p=xxx

三条安全线,一条都不能省。

第一,执行前必做备份。不管是 mysqldump 还是物理快照,先把当前状态留底。万一修错了,能退回去。

第二,必须在主库上跑,变更通过 binlog 正常复制到从库。如果直接连从库跑,变更不复制,两边又会差。

第三,别在高峰期盲目 sync。它会生成大量的 UPDATE / INSERT / DELETE,吃 IO,也吃复制带宽。选低峰窗口跑。

预防:别等出事再查

修复只是止血,预防才是根治。

binlog_format=ROW,MySQL 5.7 起默认就是 ROW,但老库还是 STATEMENT 或 MIXED 的,尽早切。ROW 格式存的是行级变更,不依赖函数重算,能挡掉大部分非确定性语句的问题。

super_read_only=1,从库开只读。注意 read_only 挡不住有 SUPER 权限的用户,要开到 super_read_only。业务账号本身没写权限,从库再锁一层,基本杜绝手工改从库。

定期跑 checksum 校验。不是出了事才跑,是当成周常或月常任务。设个 cron,低峰自动跑,结果进告警。不一致要能在监控里先看见,不是靠用户投诉才发现。

GTID + 变更管控。开了 GTID 后,别再用 sql_slave_skip_counter 跳过事务。遇到需要跳的场景,先分析原因、留档、再操作。每次 GTID 操作都要记录,留痕可追溯。

同步得上,不等于对得上

主从健康,从来不是一条延迟曲线能说清的。延迟正常,只说明从库在追,还追得挺快。它一个字都没保证,追到的东西对不对。同步得上是性能,对得上才是正确性。性能能靠监控盯,正确性只能靠校验换。你省掉的那次 checksum,不会消失。它只是变成某天对不上、又查不出从哪来的那笔账。

避坑清单

想少欠几笔这样的账,日常把这几点盯牢。

非确定性语句是主从不一致的常见源头。NOW()、UUID()、RAND() 在 STATEMENT 格式下各算各的,业务 SQL 要尽量确定性,或确保用 ROW 格式。LIMIT 不带 ORDER BY 也是坑。

校验要在低峰跑,并且限流。pt-table-checksum 不轻,--chunk-size、--sleep、--max-load 设好了再跑,别把主库拖垮。

最后一条是我自己踩的。我有一次跑 pt-table-sync --execute,没先备份也没用 --print 预览,结果一行数据的修复把关联表也带歪了。那次之后我定了条死规矩:sync 之前先 --print,--print 之后先备份,备份完才 --execute。多花十分钟,少救一次火。

写在最后

主从数据不一致,最难的不是修,是它发生了你却不知道。延迟曲线太好看,反而让人放松警惕。数据不像延迟会喊疼,它只会安安静静地,主库存一份,从库存一份,各是各的。

定期校验、从库只读、binlog 用 ROW、GTID 操作留痕,这几条听着老生常谈。可每一条,都是真踩过之后才肯老老实实补上的。复制能跑不稀奇,跑得对才值钱。

你们的主从校验是怎么跑的?多久一次,用的什么工具?评论区聊聊。

我是数据库小学妹,帮你少走弯路少踩坑,咱们下篇见👋

相关文章
|
2天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1199 1
|
25天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9587 32
|
11天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
10天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
787 1
|
6天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
522 0
|
23天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2605 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
存储 人工智能 自然语言处理
千问办公官网入口链接在哪?2026年最新QwenWork测评、千问办公怎么样?一文看懂
千问办公(QwenWork)是阿里云推出的AI智能办公平台,提供网页端和阿里云官网双入口。支持PPT/Word/Excel生成、多模态处理、网页全栈搭建、钉钉深度集成等6大核心能力。个人版免费可用,高级版198元/月;企业版198元/人/月。新用户注册即赠2000积分。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
1013 0
|
17天前
|
Windows
【保姆级】.NET Framework 3.5离线安装教程(2026最新实测)
.NET Framework 3.5是微软经典运行库,专为兼容老软件、老游戏设计。Win7自带,Win10/11需手动启用(在线或离线安装)。它与4.x系列并存不冲突,缺它会导致“找不到组件”报错。本文详解两种安装方式及常见问题解决,小白也能轻松上手。(239字)
2205 0