首页/云/云平台与虚拟化速查/数据一致性校验方法

数据一致性校验方法

一致性校验分层做:行数对比抓大头差异,校验和与抽样比对抓内容差异,业务口径抽样(金额合计、单据数)兜底; 校验要覆盖全量与增量两个阶段。

云平台与虚拟化速查云更新于 2026-10-13

是什么

数据一致性校验要分层做:行数对比抓大面上的差异,校验和与逐表比对抓内容差异,关键表的业务口径对比(金额合计、单据笔数)作为兜底。校验必须覆盖两个时机:全量迁移完成后确认存量准确,增量收敛后再确认切换前没有新增差异。校验期间目标库不能有写入,否则基线一直在变,结论不可信。

基本信息

行数对比按表统计行数,快速发现缺表缺数据
内容校验用校验和或逐表比对,发现行数相同但内容不同的情况
业务口径对关键表做金额与笔数聚合比对,贴近业务视角
时机全量完成后与增量收敛后各跑一轮,割接前必须通过
前提校验期间停止目标库写入,并保证两侧字符集与排序规则可比

典型使用场景

  • 全量迁移验收:确认存量数据完整搬过来,没有漏表漏行
  • 割接前把关:增量归零后跑最后一遍校验,结论作为放行依据
  • 定期核对:灾备链路长期运行期间按月做一次抽样比对
  • 差异定位:发现不一致后按表收敛范围,再决定补数还是回滚
  • 审计配合:把校验结果与执行时间留档,作为数据完整性的证据

校验命令示例

校验命令示例
SELECT table_name, table_rows FROM information_schema.tables
  WHERE table_schema='mydb' ORDER BY table_name;   -- 表级行数基线
CHECKSUM TABLE mydb.orders, mydb.order_items;      -- 表内容校验和
# 工具化校验:逐表切块比对,适合大表
pt-table-checksum --databases=mydb --host=<master>
# 业务口径兜底:关键表的汇总值必须两边一致
SELECT COUNT(*), SUM(amount) FROM orders WHERE created_at < '2026-10-01';

校验层次

层次方法能发现的问题
表级行数统计两侧行数并比对漏表、漏行、数据被截断
内容校验校验和或逐表比对行数相同但字段值不同的隐性差异
业务口径金额与笔数等聚合值比对字符集或精度转换导致的业务数据偏差
抽样核对关键表人工抽查明细校验和一致但语义已变的情况
校验结论要写成可复核的形式:校验对象、执行时间、执行人、差异表清单与处理结论。只写一句“已校验一致”无法作为割接放行依据。
校验期间目标库有写入会让比对基线不断变化,出现大量假差异;做最终校验前先确认停写已生效,并在校验完成后才开始放行后续步骤。

易错点

  • 只对比行数不比对内容,字段截断与字符集差异被漏检
  • 校验期间目标库仍有写入,结论不可信还浪费时间定位假差异
  • 校验和一致就认为万事大吉,忽略精度与语义层面的差异
  • 校验结论没有留档:割接后出现争议时无法证明切换前是一致的

数据来源与参考

  • MySQL 8.0 Reference Manual:CHECKSUM TABLE
  • Percona Toolkit 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌