备份初始化概述

此备份阶段初始化编写器和请求者,填充其内部数据结构,指定备份,并通过对 IVssBackupComponents::GatherWriterMetadata 的所需调用建立编写器/请求者通信。 有关详细信息,请参阅 VSS 下的备份处理概述

下表显示了备份初始化所需的操作和事件序列。

请求者操作 事件 编写器操作
创建 IVssBackupComponents 接口并初始化它以管理备份 (请参阅 CreateVssBackupComponentsIVssBackupComponents::InitializeForBackup) ,并选择性地启用或禁用系统上的编写器。
(可选)设置卷影复制操作的上下文,并根据需要查询系统,了解它支持的提供程序和卷影副本 (请参阅 IVssBackupComponents::SetContextIVssBackupComponents::Query) 。
请求者可以提供有关处理备份和还原操作的其他信息, (请参阅 IVssBackupComponents::SetBackupState)
启动与编写器的异步联系, (请参阅 IVssBackupComponents::GatherWriterMetadata) 识别 创建编写器元数据文档 (请参阅 使用编写器元数据文档CVssWriter::OnIdentifyIVssCreateWriterMetadata)

 

备份初始化期间的请求者操作

IVssBackupComponents 对象只能用于一个备份。 因此,请求者必须继续完成备份,包括释放 IVssBackupComponents 接口。 如果备份需要提前终止,则请求者需要调用 IVssBackupComponents::AbortBackup ,然后释放 IVssBackupComponents 对象 (请参阅 中止 VSS 操作 以获取) 的详细信息。 不要尝试恢复 IVssBackupComponents 接口。

通常,请求者的备份组件文档初始化为空。 调用 IVssBackupComponents::InitializeForBackup 时,可以加载存储的备份组件文档,通常支持可传输卷影复制卷。 在这种情况下,编写器-请求者的通信将与下面所述的通信稍有不同。 (有关详细信息,请参阅 导入可传输卷影复制卷 。)

若要将卷添加到卷影复制集,请求者必须先通过调用 IVssBackupComponents::SetContext 来设置卷影复制操作的上下文。 如果未调用此方法,则使用卷影副本的默认上下文VSS_CTX_BACKUP。 有关设置卷影复制上下文的信息,请参阅 卷影复制上下文配置

若要在备份之前开始完成其设置,请求者必须调用 IVssBackupComponents::SetBackupState。 通过执行此操作,请求者向编写者指示:

  • VSS_BACKUP_TYPE ) 中定义的 备份 (的类型
  • 备份是否包含可启动的系统状态
  • 请求者是支持选择单个组件还是备份整个卷。

参与备份和还原操作的所有请求者必须始终调用 IVssBackupComponents::GatherWriterMetadata。 此方法通过生成 VSS 标识 事件来启动编写器-请求者通信,以响应编写器创建其元数据文档。

在调用 IVssBackupComponents::GatherWriterMetadata 之前, 请求者有机会使用 IVssBackupComponents::EnableWriterClasses、IVssBackupComponents::D isableWriterInstancesIVssBackupComponents::D isableWriterClasses (显式启用或禁用某些特定编写器和编写器类,所有类) 启用。 调用 IVssBackupComponents::GatherWriterMetadata 后,这些调用将不起作用。

由于在调用 IVssBackupComponents::GatherWriterMetadata 之前无法获取系统上的编写器列表,因此请求者可以考虑创建并删除第二个 IVssBackupComponents 实例以获取列表。

完成 IVssBackupComponents::GatherWriterMetadata 后,无需调用 IVssBackupComponents::GatherWriterStatus。 无法处理由调用生成的标识事件的编写器不会是提供由 IVssBackupComponents::GetWriterMetadataCount 和 IVssBackupComponents::GetWriterMetadata 找到的元数据的编写器列表的一部分, (请参阅确定编写器状态) 。

备份初始化期间的编写器操作

为了响应 Identify 事件,VSS 调用每个编写器的虚拟处理程序方法 CVssWriter::OnIdentify。 编写器通过重写 CVssWriter::OnIdentify 的默认实现并使用 IVssCreateWriterMetadata 接口来创建其编写器元数据文档。

请注意,当前请求方以外的应用程序 (例如,系统应用程序) 可以生成必须由编写器处理的标识事件。 此外,编写器无法从 CVssWriter::OnIdentify 中确定哪个应用程序生成了标识事件。

在这种情况下,由于编写器在处理备份操作时可能会收到多个标识事件,因此编写器不应在 CVssWriter::OnIdentify 处理程序中设置状态信息。

相反, CVssWriter::OnIdentify 应执行一致的算法来创建编写器的编写器元数据文档,特别是因为编写器创建文档后,请求者和编写器都不能修改它。 从这一点开始,它是一个只读文档。

这意味着,在编写器从处理 Identify 事件返回后,无法更改与编写器关联的 组件 的数量和类型,这些文件是每个组件的一部分,并且无法更改从备份或还原操作中显式排除文件。

参与 VSS 的所有编写者都需要执行以下操作:

  1. 指示使用 IVssCreateWriterMetadata::SetRestoreMethod 由编写器管理的所有组件的还原方法。
  2. 使用 IVssCreateWriterMetadata::AddComponent 添加至少一个组件 (有关组件规范) 的详细信息,请参阅 由编写器定义 组件。

编写器通过添加文件集(路径的组合)来指示要参与备份或还原操作 的文件, 文件规范和递归标志 - 到使用 IVssCreateWriterMetadata::AddFilesToFileGroupIVssCreateWriterMetadata::AddDatabaseFilesIVssCreateWriterMetadata::AddDatabaseLogFiles 的给定组件,具体取决于类型 (请参阅 将文件添加到 Components.)

编写器可能还有一个或多个空组件,即未向其添加任何文件的组件。 这些在组织编写器的组件时非常有用。 (请参阅 Components 的逻辑路径。)

编写器使用 IVssCreateWriterMetadata::AddExcludeFiles 显式阻止文件包含在备份中。 此显式排除非常有用,因为通配符可用于指定要包含的文件 (请参阅 排除文件列表规范) 。 请注意,排除文件列表优先于组件文件列表。

IVssCreateWriterMetadata::AddAlternateLocationMapping 用于为已添加到编写器组件之一的指定文件集创建 备用位置映射 。 还原到文件的原始位置不可行或不可取时,这些映射在文件还原期间使用。 (请参阅 实际文件还原 和非 默认备份和还原位置概述。)

由于备份文件集是在编写器元数据文档中指定的,因此以后无法对其进行修改。 因此,应对编写器进行编码,以便文件集的定义将包含备份中所需的所有文件(按名称或通过通配符)。 可以想象,这可能包括一些可能在“标识”事件后创建的文件。