先给结论:不要用“导出成功”当作完整性通过,而要用“分页计数、边界样本、重复项”三组证据交叉验证。小样本下逐页对照还能成立,一旦分页数量上升、导出任务被拆分或中途重试,就必须改为可复算的校验流程,否则遗漏会藏在看似正常的文件里。
第一种条件:分页总量少、导出任务一次完成、没有重试记录。此时可以抽检首页、末页和中间一页,确认页码连续、条数递增正常。第二种条件:分页数量多、任务被中断后继续、或同一批数据分多次导出。此时抽检不再可靠,因为遗漏往往发生在断点附近,而不在头尾。
判断依据不是感觉,而是三个可观察信号:导出日志里是否出现重试、分页参数是否在两次导出间发生变化、文件总条数与分页数乘以每页条数是否吻合。只要出现任意一个信号,就应升级为全量校验。实施动作是:先记录本次导出的分页起点、终点和每页条数,再按这三个数计算理论条数,与实际文件条数比较。如果两者不等,下一步不是重新导出全部,而是先定位差异落在哪一段分页。
规模化场景下,最实用的做法是给每页生成一个稳定指纹,而不是依赖文件顺序。指纹可以取该页首条和末条记录的主键,或取该页条数与一个稳定排序字段的组合。导出完成后,按页号列出指纹清单,再与预期页号序列比对。
这里的实际动作是:把指纹清单按页号排序,标记缺号、重叠和末页异常三类问题。标记结果决定下一步——缺号需要补导对应页;重叠需要检查排序字段是否唯一;末页异常需要确认分页终止条件是否正确。不要跳过标记直接重新全量导出,那样只会把问题掩盖到下一轮。
总条数吻合不代表内容完整,因为重复项可能抵消遗漏项。要专门检查三类边界样本:排序字段的最小值、最大值,以及分页切换处的相邻记录。假设某次导出按更新时间排序,每页100条,共12页。若第6页末条与第7页首条之间缺少一条更新时间处于两者之间的记录,总数仍可能因别处重复而看起来正常。这个例子说明:总数只能作为初筛,边界样本才是定位证据。
实施动作是:从导出文件中取出每页首条和末条,与源端同条件的查询结果逐页比对。比对结果若出现某页首尾不衔接,下一步应检查该页的排序字段是否存在重复值,因为重复值会让分页边界不稳定,进而造成跨页遗漏。这个检查在样本少时容易被忽略,在规模化后却是高频例外。
如果导出的数据本身没有稳定唯一键,指纹法会失效,此时应改用“字段组合去重后计数”作为替代校验,并明确该计数只能证明数量,不能证明具体哪条缺失。如果导出任务允许并发写入,源端数据在导出期间发生变化,那么任何基于总数的比对都可能出现合理偏差,正确做法是先固定一个时间截面,再在该截面内校验。
还有一种例外:工具只提供导出结果、不提供分页日志。此时无法复算理论条数,只能退回到边界样本和去重计数,并在交付说明中写清校验覆盖范围。这个边界不能省,否则读者会把局部通过误当成整体完整。
这三步的结果直接影响下一步:条数吻合且指纹连续,才进入交付;任一项不通过,先修复对应区间,再重新生成指纹清单确认。这样做的价值在于,把“导出成功”这个模糊信号,替换成可以逐项复算的证据链,遗漏也就无处藏身。