文件的实际备份概述

VSS 使请求者能够访问包含要备份的数据的卷的卷的卷影副本,并将数据复制到备份介质。 编写器通常在此过程中继续正常操作。 有关详细信息,请参阅 在 VSS 下处理备份概述

下表显示了要备份的文件所需的操作和事件序列。

请求者操作 事件 编写器操作
访问卷影复制卷上的文件 (请参阅 IVssBackupComponents::GetSnapshotPropertiesVSS_SNAPSHOT_PROP)
生成要备份的文件列表,并将文件数据复制到备份介质。
使用 IVssBackupComponents::SetBackupSucceeded 指示备份的成功或失败。
请求者通过调用 IVssBackupComponents::BackupComplete 指示备份已完成。 BackupComplete 执行任何备份后清理 (请参阅 CVssWriter::OnBackupCompleteIVssWriterComponentsIVssComponent) 。
请求者等待所有编写者使用 IVssAsync 确认收到 IVssBackupComponents::BackupComplete 事件。 它还应验证编写器状态 (请参阅 IVssBackupComponents::GatherWriterStatusIVssBackupComponents::GetWriterStatus) 。 请求者此时必须调用 GatherWriterStatus ,使编写器会话设置为已完成状态。 注意: 这仅在 Windows Server 2008 Service Pack 2 (SP2) 及更早版本上是必需的。
将备份组件文档和每个编写器元数据文档保存到 XML 文档,这些文档可以写入备份媒体 (请参阅 IVssBackupComponents::SaveAsXMLIVssExamineWriterMetadata::SaveAsXML) 。

 

文件备份期间的编写器操作

卷影复制完成后,正在备份的系统上的所有 I/O 操作都应能够恢复,而不会破坏备份的完整性。 这是拥有卷影复制功能的主要动机之一。

因此,正如在发现阶段 (请参阅 备份发现阶段 概述) ,在实际备份文件时,对编写器的要求很少。

备份完成后,请求者生成 BackupComplete 事件后,VSS 将调用每个编写器的 CVssWriter::OnBackupComplete 方法,该方法默认仅返回 TRUE。 但是,编写器可以重写默认实现并采取删除剩余临时文件等操作,或使用调用它的 IVssWriterComponents 接口检查其每个包含的显式组件 (以及它们可能定义) 的任何组件集的备份状态,方法是检索相应的 IVssComponent 对象。 然后,编写器可以通过调用 IVssComponent:GetBackupSucceeded 确定备份的成功或失败并采取措施。 仅当已成功备份组件中所有显式包含的文件及其任何子组件中所有隐式包含的文件时,IVssComponent:GetBackupSucceeded 返回的值才为 TRUE

完成对 CVssWriter::OnBackupComplete 的调用后,请求者应为每个编写器调用 IVssBackupComponents::GatherWriterStatusIVssBackupComponents::GetWriterStatus (,) 最后一次。 编写器会话状态内存是有限的资源,编写器最终必须重用会话状态。 此步骤将编写器的备份会话状态标记为已完成,并通知 VSS 此备份会话槽可由后续备份操作重复使用。

备份文件时的请求者操作

备份发现阶段概述中所述,在卷影副本完成之前,不应生成要备份的文件的实际列表。

与给定卷的卷影副本对应的 设备对象 用于在卷影复制完成后访问卷影复制卷上的文件。 设备对象是从 IVssBackupComponents::GetSnapshotProperties 返回的 VSS_SNAPSHOT_PROP 对象获取的。 卷影副本集的每个卷影副本都有自己的设备对象。

然后,使用设备对象和从组件的编写器元数据文档规范中获取的路径来选择要备份的文件。 有关详细信息 ,请参阅请求者访问卷影复制的数据

备份列表中将包含哪些文件取决于特定备份的性质、备份的组件 可选择性以及编写器的逻辑路径结构 (请参阅 使用备份) 的可选择性

除了组件中指定的文件外,给定编写器可能还具有显式排除的文件。 无论选择了哪些组件,都必须始终遵循文件排除。

同样如 备份发现阶段概述中所述,装载的文件夹或重新分析点可以出现在卷影副本中,并且可以备份。 但是,无法对卷影复制卷遍历装载的文件夹或重新分析点 (请参阅 使用装载的文件夹和重分析点) 。

如果 IVssWMFiledesc::GetAlternateLocation 返回的备用路径不为空,在备份操作期间也应小心。 备用路径不同于 备用位置映射 ,因为它仅在备份期间使用,而备用位置映射仅在还原期间使用。

在这种情况下,不会从 IVssWMFiledesc::GetPath) 指示的正常位置 (备份数据,而是从 IVssWMFiledesc::GetAlternateLocation 返回的位置备份数据。 还原时,文件应返回到其正常位置。 有关详细信息 ,请参阅非默认备份和还原位置

VSS 对将数据备份到存储介质或选择该介质的实际机制没有限制。 但是,建议将每个 编写器实例 的每个组件的文件作为一个单元进行处理。 有关 生成备份 文件列表的最佳做法的讨论,请参阅生成备份集。

备份由给定组件管理的任何文件的成功或失败 (如果它定义 组件集) 其 子组件 集给定编写器实例,应通过调用 IVssBackupComponents::SetBackupSucceeded 保留在备份组件文档中。 如果由组件或组件集管理的任何文件无法备份,则整个组件将失败。 应始终记录有关无法备份的文件的确切信息。

开发人员可能会发现,在备份介质上存储有关要备份的文件、他们所属的组件和组件集、其规范以及原始路径的记录很有帮助。 存储信息(例如每个编写器的组件定义)可能也很有用。 这样做可以使检索操作更简单。 但是,此类详细信息留给请求者开发人员。

由于编写器可以在处理由请求者调用 IVssBackupComponents::D oSnapshotSet 生成的 PostSnapshot 事件时修改备份组件文档,因此在异步调用完成后,不应保存备份组件文档。

虽然它可能更早发生,但这也是保存编写器元数据文档的方便时间。

使用 IVssBackupComponents::SaveAsXMLIVssExamineWriterMetadata::SaveAsXML 保留备份组件文档和编写器元数据文档非常重要。 如果不是,则无法在文件还原期间使用 VSS。

除了存储原始元数据之外,某些备份应用程序可能会发现,将自己的文件列表的副本 (以自己的优化格式保存到备份介质中,) 及其关联的编写器、组件、还原过程和位置信息,以供以后检索。 此类列表可用于避免在还原期间对编写器元数据文档和备份组件文档进行某些分析和比较。

正在备份的卷可能包含不由 VSS 编写器管理的数据。 可以而且应该从卷影复制卷备份此数据,该卷将处于 崩溃一致状态。 有关详细信息,请参阅 不参与编写器的备份