VSS 增量备份和差异备份中的请求者角色

若要支持 增量 备份或 差异 备份操作,请求者必须执行以下操作:

  1. 确定使用 IVssBackupComponents::GetWriterMetadata 访问编写器元数据文档) 中的信息 (可用的编写器支持程度,特别是确定 (VSS_BACKUP_SCHEMA) 支持的备份架构。
  2. 设置适当的备份状态。
  3. 获取增量备份或差异备份的文件和文件集级别规范。
  4. 执行备份。

增量和差异支持和配置的请求者确定

请求者需要先获取有关编写器支持的信息,然后再选择要包含在增量备份或差异备份中的组件或设置自己的状态。

确定编写器支持

请求者通过使用 IVssExamineWriterMetadata::GetBackupSchema 方法检索编写器的备份架构掩码,确定给定编写器支持 VSS 增量备份还是差异备份。

支持 VSS 增量或差异技术的编写器的备份架构掩码将包含 VSS_BS_INCREMENTALVSS_BS_DIFFERENTIAL,或者同时包含这两者。 编写者还可以指示他们参与 VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL 标志的限制。 (有关 备份架构) 的详细信息,请参阅VSS_BACKUP_SCHEMA。

设置请求者备份状态

请求者通过在生成 PrepareForBackup 事件之前使用 IVssBackupComponents::SetBackupState 方法将备份类型设置为VSS_BT_INCREMENTALVSS_BT_DIFFERENTIAL来指示备份是增量备份或差异备份。

IVssBackupComponents::SetBackupState 方法还用于指示请求者是否提供部分文件支持,这通常用于实现某些增量备份和还原操作。

获取增量备份和差异备份的编写器规范

成功返回 IVssBackupComponents::GatherWriterMetadata 后,每个编写器的编写器元数据文档中包含的文件集级文件备份规范信息 (VSS_FILE_SPEC_BACKUP_TYPE) 可供检查。

但是,编写器可以添加 差异文件 或请求 部分文件支持 ,直到成功处理 PostSnapshot 事件。

差异文件和部分文件支持规范可以替代文件规范备份类型,因此请求者可能需要推迟对有关增量备份和差异备份的所有编写器规范的完整分析,直到 成功返回 IVssBackupComponents::P repareForBackup 之后。

获取文件备份规范信息

(VSS_FILE_SPEC_BACKUP_TYPE) 的文件集级文件备份规范信息包含在每个编写器的编写器元数据文档中,可以在 成功返回 IVssBackupComponents::GatherWriterMetadata 后立即检查。

请求者必须为要包含在增量备份或差异备份中的每个编写器组件的每个文件集获取文件备份规范掩码 (VSS_FILE_SPEC_BACKUP_TYPE) ,无论组件是 显式 包含还是 隐式 包含组件。

请求者可以使用 IVssBackupComponents::GetWriterComponentsCount 和 IVssBackupComponents::GetWriterComponents 来确定必须查询哪些编写器的编写器元数据文档。 IVssBackupComponents::GetWriterComponents 返回的 IVssWriterComponentsExt 接口的实例通过 IVssWriterComponentsExt::GetWriterInfo 方法提供编写器信息。

请求者通过 IVssExamineWriterMetadata::GetComponent 的 IVssWMComponent 接口实例获取组件信息,该接口对应于由给定编写器管理的包含组件。

有关由对应于 IVssWMComponent 接口的组件管理的文件集的信息是通过调用 IVssWMComponent::GetFileIVssWMComponent::GetDatabaseFileIVssWMComponent::GetDatabaseLogFile ((视情况而定) )获取的。

这些调用可以为组件的每个文件集返回 IVssWMFiledesc 接口的实例。

通过调用 IVssWMFiledesc::GetBackupTypeMask 获取文件集的文件规范备份类型。

获取部分文件和差异文件信息

请求者通过 IVssComponent 接口获取部分文件和差异文件信息。

请求者可以使用 IVssBackupComponents::GetWriterComponentsCount 和 IVssBackupComponents::GetWriterComponents 循环访问备份中包含的所有编写器。

IVssBackupComponents::GetWriterComponents 返回的 IVssWriterComponentsExt 接口的实例提供对相应 IVssComponent 接口的所有实例的访问权限 通过 IVssWriterComponentsExt::GetComponent 和 IVssWriterComponentsExt::GetComponentCount 方法显式包含给定编写器的组件。

对于架构支持增量备份或差异备份的所有编写器(即其备份架构掩码(IVssExamineWriterMetadata::GetBackupSchema)返回的编写器,请求者需要遍历所有 IVssComponent 实例,包括VSS_BT_INCREMENTAL备份类型时VSS_BS_INCREMENTAL,或者在备份类型为VSS_BS_DIFFERENTIALVSS_BS_DIFFERENTIAL

部分文件信息是通过调用 IVssComponent::GetPartialFileCountIVssComponent::GetPartialFile 获取的, (请参阅 使用部分文件) 。

对于支持基于文件上次修改数据的备份操作的编写器, (其备份架构掩码( IVssExamineWriterMetadata::GetBackupSchema 返回)包括 VSS_BS_LAST_MODIFY) ,则通过调用 IVssComponent::GetDifferencedFilesCountIVssComponent::GetDifferencedFile 获取差异文件信息。

请注意,差异文件可能是新文件,即当前不是给定编写器的编写器元数据文档中任何文件集的成员的文件。

请求者不应同时查找部分文件操作和差异文件包含的文件。 如果请求者确实遇到这种情况,它应返回并记录编写器错误。

请求者仍可以选择继续备份有问题的编写器的文件,但在这种情况下,应根据差异文件信息中的规范执行此操作。

实现增量备份或差异备份

在实现备份之前,请求者应了解哪些编写器支持 增量 备份或 差异 备份、所有请求的部分文件操作、所有差异文件以及所有其他文件的文件规范备份类型。

非支持编写器

架构不支持增量备份或差异备份的编写器 (其备份架构掩码(IVssExamineWriterMetadata::GetBackupSchema 返回)的编写器在备份类型为VSS_BT_INCREMENTAL时包含VSS_BS_INCREMENTAL,或者在备份类型为VSS_BS_DIFFERENTIAL时不包括VSS_BS_DIFFERENTIAL,) 无法为增量备份或差异备份操作提供任何直接支持。

这并不一定意味着写入者的数据不会参与增量备份或差异备份操作。 但是,要执行的操作由请求者自行决定。 请求者可以执行以下任一操作:

  • 备份任何属于非支持编写器的文件 (向用户明确指示这一点)
  • 备份非支持编写器的所有文件
  • 使用文件系统数据和请求者自己的历史记录日志执行增量备份。

应谨慎使用最后一种替代方法,并且仅当请求者了解所涉及的编写器是否可以支持独立于 VSS 机制的数据增量备份或差异备份和还原时。

支持编写器

请求者需要处理 (,以便) 编写器的所有 差异文件,然后处理任何 部分文件 请求,然后根据其文件规范备份类型 (VSS_FILE_SPEC_BACKUP_TYPE) 备份剩余文件。

  1. 备份差异文件:

    对于支持基于上次修改数据的备份操作的编写器 (其备份架构掩码(由 IVssExamineWriterMetadata::GetBackupSchema 返回)包括 VSS_BS_LAST_MODIFY) 的编写器,请求者使用 IVssComponent::GetDifferencedFile 返回的路径、文件规范和递归标志信息来生成文件列表,作为增量备份或还原的候选项。

    IVssComponent::GetDifferencedFile 还可以返回上次修改的时间, (表示为 FILETIME 结构) 。

    如果编写器提供的上次修改时间非零,则请求者将它用作 (的基础,而不是文件系统信息或请求者自己的存储数据) 来确定文件应包含在 增量 备份还是 差异 备份中。

    例如,如果编写器返回的文件上次修改时间为:

    • 最后一次完整备份后,该文件应包含在增量备份和差异备份中。
    • 在上一次完整备份之后,但在上次增量备份之前,该文件应包含在增量备份操作中,但不应包含在差异备份中。

    如果编写器提供的上次修改时间为零,则请求者必须使用文件系统信息和其自己的存储数据来确定差异文件的修改时间。

  2. 使用部分文件操作:

    如果编写器已请求使用部分文件操作备份文件,则请求者使用文件偏移量信息将指示的文件段保存到备份媒体。 (有关 部分文件 操作) 的详细信息,请参阅使用部分文件。

    如上所述,编写器不应同时将文件指定为差异文件和部分文件操作的参与者。 如果请求者确实遇到这种情况,它应返回并记录编写器错误。

    请求者仍可以选择继续备份有问题的编写器的文件,但在这种情况下,应根据差异文件信息中的规范执行此操作。

  3. 使用文件规范备份类型:

    在处理了所有差异文件和部分文件操作后,请求者现在根据其文件规范备份类型处理备份集中的所有剩余文件 (VSS_FILE_SPEC_BACKUP_TYPE) 。

    VSS_FILE_SPEC_BACKUP_TYPE枚举有三个影响差异备份和增量备份的“需要备份”值:

    • VSS_FSBT_ALL_BACKUP_REQUIRED
    • VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED
    • VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED

    有三个“需要卷影复制”值:

    • VSS_FSBT_ALL_SNAPSHOT_REQUIRED
    • VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED
    • VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

    使用文件规范备份类型“需要卷影副本”标记的文件集表示,请求者在执行增量、差异或 ALL (时需要从卷影副本复制数据,其中包括增量操作和差异操作) 备份操作。

    应用于 INCREMENTAL、DIFFERENTIAL 或 ALL 备份操作的“需要备份”标志指示编写器希望在还原任何备份操作后,文件集的当前版本的副本可用。 通常,这意味着,如果文件集标记为“需要备份”,则请求者会在增量备份或差异备份期间将其所有成员复制到备份介质,而不管上次备份或修改的时间如何。

    默认情况下,文件集将添加到文件规范备份类型为 VSS_FSBT_ALL_BACKUP_REQUIRED |VSS_FSBT_ALL_SNAPSHOT_REQUIRED。 因此,除非编写器显式设置文件规范备份类型,否则请求者需要复制那些未由部分文件操作处理的文件,或者大多数文件集中指定的差异文件通常会全部复制到备份介质。

备份标记

支持备份标记 (VSS_BS_TIMESTAMP) 的编写器可以选择生成备份标记信息,以用于支持将来的增量备份和差异备份和还原操作。

包含备份标记信息的字符串中包含的格式和信息对生成它们的编写器是专用的;请求者不知道如何处理此信息。

支持编写器使用 IVssComponent::SetBackupStamp 方法将备份标记以字符串的形式存储在备份组件文档中。

如果备份标记信息存在,则请求者在处理备份标记信息时的角色 () ,以便通过在将来的备份或还原操作中调用 IVssBackupComponents::SetPreviousBackupStamp 来使其可供编写器使用。