先给结论:自动导出遗漏分页,通常不是“导出按钮坏了”,而是分页边界、去重规则和增量标记三者中至少一个没有对齐。检查完整性不能靠再点一次导出,而要先确认遗漏发生在哪一层,再用可复现的对照结果决定是修规则还是换导出方式。
这两种情况的表现很像,处理方式却相反。边界漏页指最后一页或某个临界页没有被抓进文件,通常和总数取整、页码从0还是从1开始、每页条数上限有关。中途丢页指总页数看起来完整,但中间某些页因为超时、限流或去重被跳过。
判断依据可以看三个信号:一是导出记录的条数与分页总数乘以每页条数是否吻合;二是相邻页的首尾记录能否自然衔接;三是重复记录是否集中在页与页的交界处。如果只有末尾缺失,优先怀疑边界;如果首尾衔接断裂出现在中间,优先怀疑请求失败或去重过度。
当总量不大、接口允许一次性返回时,最可靠的检查是做一次不分页的完整导出,再与自动分页结果逐条比对。动作很具体:固定同一组筛选条件、同一时间范围,分别跑一次全量导出和一次分页导出,然后按唯一标识做差集。
结果怎么用:如果差集只出现在末页,说明分页上限或取整有问题,下一步应调整每页条数或补一次末页请求;如果差集散布在中间,说明是请求稳定性问题,下一步应加失败重试和断点续传,而不是继续改分页参数。这个对照只在总量可控时成立,数据量一大,全量导出本身就可能超时,结论不再可靠。
总量超过单次导出上限时,全量对照不再可行,需要改成逐页自检。假设每页返回100条、按创建时间倒序,那么第2页的第一条应当紧接第1页的最后一条。可以记录每页的首尾标识和时间戳,导出结束后检查这条链是否连续。
具体动作:在导出脚本里为每一页写入页码、请求时间、返回条数、首条标识、末条标识五个字段,导出完成后按页码排序,检查返回条数是否都等于预期值,以及页与页之间是否出现时间戳跳变。出现跳变的那一页就是嫌疑页,下一步针对性重拉该页,而不是重跑整个任务。
这个方法的边界在于:如果数据在导出期间仍在新增或修改,倒序链本身就会断裂,此时时间戳跳变不能证明漏页。需要先冻结写入或用快照时间点,否则校验结果不可信。
很多自动导出会在写入前按某个字段去重。如果去重键选得不对,比如用了可能重复的标题或URL,而实际唯一标识是另一列,就会把不同记录当成重复项删掉,表现为“页数对、条数少”。
检查动作:把去重前后的条数分别记录,并抽出去重掉的记录看它们是否真的完全相同。如果被去掉的记录在唯一标识上并不相同,说明去重键选错了。修正去重键后重新导出,再跑一次页间校验,确认条数回升且链条连续。
有两种情形应停止排查。第一,来源本身在导出窗口内持续变动,任何静态完整性结论都只是某一刻的近似,此时应改为记录快照时间并接受区间内的不确定性。第二,遗漏集中在已被上游删除或过滤的记录上,这类缺失属于预期行为,继续补拉只会引入已失效数据。
把上面的判断落成一句可执行的话:先定位遗漏层级,再用与数据量匹配的对照方式验证,最后确认去重和变动窗口是否让结论失效。只有这三步都通过,导出的完整性才值得信任。