备份前任务概述
VSS 下的预备份任务侧重于创建包含备份数据的卷的卷影副本。 备份应用程序将从卷影副本而不是实际卷中保存数据。 有关详细信息,请参阅 VSS 下的备份处理概述。
请求者通常等待编写器准备备份和创建卷影副本。 编写器必须确定它是否要参与备份,如果是,则将其文件和本身配置为准备好进行备份和卷影复制。 下表显示了准备备份操作所需的操作和事件序列。
请求者预备份任务
此外,在创建 IVssBackupComponents::P repareForBackup 事件之前,请求者还可以使用 IVssBackupComponents::SetBackupOptions 为单个编写器设置备份选项,具体取决于每个编写器的详细信息以及请求者是否知道它们。
为了支持增量和差异操作,请求者此时可以选择使用 IVssComponent::GetBackupStamp (检查早期备份操作的时间戳组件) ,并使用这些信息为编写器设置以前的时间戳,以便使用 IVssBackupComponents::SetPreviousBackupStamp) 处理 (。 有关详细信息 ,请参阅增量备份和差异备份 。
请求者现在可以指示系统的编写器完成备份前准备工作并处理卷影副本的创建。
首先,请求者通过调用 IVssBackupComponents::P repareForBackup 生成 PrepareForBackup 事件。
当所有参与编写器从处理 PrepareForBackup 事件 (请求者使用 PrepareForBackup 返回的 IVssAsync 接口的实例确定) 后, 请求者可以通过调用 IVssBackupComponents::D oSnapshotSet 来启动卷影复制,随着它的进展,它将生成 PrepareForSnapshot、Freeze、Thaw 和 PostSnapshot 事件供编写器处理。
在某些情况下,请求者可能不需要创建卷影副本。 具体而言,由给定编写器组件之一管理的每个文件集都有一个文件规范备份掩码, (标识事件期间) 设置VSS_FILE_SPEC_BACKUP_TYPE值的按位 OR 指示。 除其他事项外,此掩码指定文件集是否要求在执行备份之前复制系统卷影。
如果任何卷上都没有要备份的文件集需要卷影副本,则无需调用 IVssBackupComponents::D oSnapshotSet 。
编写器备份前任务
处理 PrepareForBackup 事件时,VSS 将调用每个编写器的 CVssWriter::OnPrepareBackup 方法,这是一种虚拟方法,默认情况下仅返回 true。
编写器可以重写此默认实现,并使用 处理查找有关即将进行的备份的信息并采取措施。
编写器可使用以下方法确定有关所考虑的备份操作类型的信息:
编写器使用 CVssWriter::IsPathAffected 确定其管理的文件是否将涉及卷影副本。
更重要的是,当 VSS 调用 CVssWriter::OnPrepareBackup 方法时,它会传入 IVssWriterComponents 接口的实例,该接口允许通过 IVssComponent 接口直接访问请求者的备份组件文档中 显式包含 的组件。 编写器使用定义组件集的 IVssComponent 接口实例来访问其 隐式包含 的组件 (请参阅 可选项和使用组件属性) 。
在 处理 PrepareForBackup 事件期间,编写器使用 IVssComponent 接口执行按组件 (或按组件集设置的组件) 操作,包括:
- 如果 (支持) ,则通过调用 IVssComponent::AddPartialFile 添加部分文件。
- 设置编写器处理还原所需的任何私有元数据。
- 如果编写器支持增量备份和差异备份 (请参阅 增量备份和差异备份) ,请执行以下操作:
- 通过调用 IVssComponent::GetPreviousBackupStamp 检查以前的备份时间戳。
- 通过调用 IVssComponent::AddDifferencedFilesByLastModifyTime 添加任何必需的差异文件。
- 如果编写器支持 VSS_BS_TIMESTAMPED 架构,请使用 IVssComponent::SetBackupStamp 以编写器自己的格式添加备份时间戳字符串。
- 启动非常耗时的异步操作,例如跨多个磁盘同步数据。 这将允许编写器在处理操作时继续工作,包括处理其他 VSS 事件。 这些操作必须在 冻结 事件之前终止。
请求者调用 IVssBackupComponents::D oSnapshotSet 会启动卷影副本,并生成以下事件供编写器处理:
编写器的三个处理程序(CVssWriter::OnPrepareSnapshot、 CVssWriter::OnFreeze 和 CVssWriter::OnThaw)是纯虚拟方法,每个编写器必须实现它们,而不是依赖于默认值。 根据编写器的需求,它们可以编码为虚拟方法,只需返回 TRUE。
由于 冻结 事件的发出和 Thaw 事件的发出之间的时间窗口通常很窄,因此准备卷影副本的大多数主要工作(例如关闭进程、创建临时文件或排空 I/O 队列)将在 CVssWriter::OnPrepareSnapshot 中处理。
编写器在创建卷影副本之前如何使用 CVssWriter::OnPrepareSnapshot 来处理其 I/O,这在很大程度上取决于编写器自己的体系结构。
在 冻结之前,能够保留所有写入并使数据保持绝对一致状态的编写器应该这样做。
如果编写器无法冻结其 I/O,则应采取措施创建稳定的备份源,并减少卷影副本的恢复时间。 其中的示例可能包括排队传入的 I/O 请求,或在 备用路径 中生成一组重复的文件,以用作备份源。
CVssWriter::OnFreeze 方法执行简单的短任务,例如验证 CVssWriter::OnPrepareSnapshot 是否使 I/O 处于正确状态,以及 CVssWriter::OnPrepareBackup 启动的任何异步任务是否已完成。 如果存在问题,请参阅编写器错误和否决 () ,此方法是 编写器 否决卷影副本的最后机会。
通常,编写器可以在 解冻 事件后恢复正常运行:解冻后,卷影副本可能无法立即准备好备份,但编写器应能够恢复正常操作。 因此,编写器通常使用 CVssWriter::OnThaw 返回到预冻结状态。 但是,为支持卷影复制而创建的任何临时文件都应保留到 PostSnapshot 事件。 通常,你会使用 CVssWriter::OnPostSnapshot 进行这种清理。 由于许多应用程序不需要此类清理, 因此 CVssWriter::OnPostSnapshot 是一种虚拟方法,其默认实现仅返回 TRUE。 如果正在执行增量备份或差异备份,编写器可能会调用 IVssComponent::GetPreviousBackupStamp 和 IVssComponent::SetBackupStamp。 有关详细信息,请参阅 备份复杂存储中的编写器角色。 此时可以调用的另一种方法是 IVssComponent::AddDifferencedFilesByLastModifyTime。