结论先给:如果扫描工具在中断时已经落盘了逐条状态记录,你可以按“已确认完成、已发起未确认、未发起”三档来界定覆盖范围;如果只有一份进度百分比或最后一条日志,那么覆盖范围只能按批次边界粗略估计,不能当作完整结果继续用。接下来要做的不是重新跑一遍全站,而是先确定这三档的边界,再决定是补扫缺口还是整批重来。
判断覆盖范围的前提,是中断时留下了什么。常见的有三类:逐条状态记录、批次级完成标记、以及仅有的运行日志。三类证据对应的结论强度完全不同。
先做这个判断,是因为它直接决定下一步动作的成本。逐条记录可以只补缺口;批次标记通常要重跑最后一个未完成批次;只有日志时,稳妥做法是把最后若干个批次整体重跑,而不是从日志断点继续。
很多中断之所以难判断,是因为把“发起了请求”当成了“已经拿到结果”。这两件事在中断场景下必须拆开。
一个可操作的划分方式:
只有第一档能计入覆盖范围。第二档必须视为缺口,因为请求发出不等于结果可用,写入中断还可能留下半条不完整的记录。第三档显然要补。
假设一次扫描共 2000 个查询对象,中断时逐条状态显示 1200 条已完成、150 条已发起未确认、650 条未发起。此时可用的覆盖范围是 1200 条,缺口是 800 条。下一步动作就是只对这 800 条补扫,而不是重跑全部 2000 条。这个数字只是说明比较方法的假设例子,不代表任何真实项目的规模。
有一个反例值得单独说:如果中断发生在结果写入阶段,而不是请求阶段,那么逐条状态记录本身可能是错的。比如某条记录已被标记为“已完成”,但对应的结果文件只写了一半,读取时会报错或字段缺失。这时按状态记录算出的覆盖范围会偏高。
识别这种情况的办法是抽样校验:从“已确认完成”的记录里随机抽一小批,实际读取结果,检查字段是否完整、条数是否对得上。如果抽样中发现明显比例的记录不可读,那么状态记录的可信度就要下调,覆盖范围应按批次重新界定,而不是相信逐条状态。
另一个会让结论失效的条件是:扫描中途更换过查询口径或对象清单。如果中断前后用的不是同一份对象清单,那么“已覆盖多少”这个问题本身就没有统一基准,需要先确认清单版本,再谈覆盖范围。
判断覆盖范围的目的,是决定补扫还是重跑。可以按下面的顺序执行:
这里的关键取舍是:补扫省时间,但要求状态记录可信;重跑更稳,但成本更高。抽样校验就是用来在这两者之间做选择的依据。校验通过就补扫,不通过就重跑,这个判断不需要等到全部结果都读完才做。
进度百分比通常由已完成数量除以总数得出,它不区分“已确认完成”和“已发起未确认”。中断时显示的百分比往往偏高,因为已发起的请求可能被计入了进度。用它来推断覆盖范围,容易把缺口算小。
更可靠的做法是以落盘的可读结果条数为准,而不是以进度显示为准。如果工具只提供进度百分比,没有逐条状态,那么覆盖范围只能按批次估算,并且要在补扫时把最后一个未完成批次整体重跑,避免批次内部的半完成记录被漏掉。
把这些边界确认清楚之后,再决定补扫范围,比直接重新跑一遍全站更省成本,也比盲目相信进度百分比更可靠。