备份复杂存储中的请求者角色

与 VSS 下的所有重要操作一样, 增量 备份和 差异 备份需要请求者和编写器之间密切合作。

备份类型

基础结构为五种类型的备份提供特殊支持。 这些步骤如下所述:

  • 完整 (VSS_BT_FULL) 。 无论文件上次备份日期如何,都会备份文件。 将更新每个文件的备份历史记录,此类备份可用作增量备份或差异备份的基础。 如果存在日志文件,则可能由于此备份而截断它们。

    还原完整备份只需要单个备份映像。

  • 差异 (VSS_BT_DIFFERENTIAL) 。 VSS API 用于确保仅将自上次完整备份以来已更改或添加的文件复制到存储介质;忽略所有中间备份信息。 这可能包括整个文件或文件中的特定范围。 差异备份与完整备份相关联,通常在还原完整备份之前无法还原。 如果存在日志文件,则由于此备份,它们通常不会截断。

    还原差异备份需要原始备份映像和自上次完整备份以来进行的最新差异备份映像。

  • 增量 (VSS_BT_INCREMENTAL) 。 VSS API 用于确保仅将自上次完整备份或增量备份以来已更改或添加的文件复制到存储介质。 这可能包括整个文件或文件中的特定范围。 某些编写器不允许增量备份与差异备份混合。 如果存在日志文件,则可能由于此备份而截断它们。

    还原增量备份需要原始备份映像和自初始备份以来创建的所有增量备份映像。

  • 日志备份 (VSS_BT_LOG) 。 只有写入器的日志文件 (使用 IVssCreateWriterMetadata::AddDataBaseLogFiles 方法添加到组件的日志文件,并通过调用 IVssWMComponent::GetDatabaseLogFile) 进行检索。 此备份类型特定于 VSS。 日志备份往往非常频繁。 通常,由于此备份,日志文件将被截断。

  • 复制备份 (VSS_BT_COPY) 。 与VSS_BT_FULL备份类型一样,无论其上次备份日期如何,文件都将备份。 但是,不会更新每个文件的备份历史记录,这种备份不能用作增量备份或差异备份的基础。 由于复制备份,不应截断日志文件。

部分文件支持

某些编写器通过覆盖所管理的文件部分来支持文件还原。 请求者可能设计为利用此目的,如果是这样,则通过设置 IVssBackupComponents::SetBackupState 中的信息来指示这一点。

请求者指定通过 IVssBackupComponents::SetBackupStatebackupType 参数执行的备份类型。 不同的编写器将支持不同类型的备份。 调用 IVssBackupComponents::GatherWriterMetadata 后,请求者可以通过调用 IVssExamineWriterMetadata::GetBackupSchema 来确定给定编写器支持的备份类型。 返回的值是一个位掩码,指示支持不同的备份类型。 VSS_BS_DIFFERENTIAL 表示支持差异备份、增量备份 VSS_BS_INCREMENTAL 、日志备份 VSS_BS_LOG ,以及复制备份 VSS_BS_COPY ;所有编写器都必须支持完整备份。 如果编写器不支持将增量备份与差异备份混合使用,则也会添加 VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL 标志。 如果请求者正在执行增量备份或差异备份,并且给定编写器不支持该备份类型,则应对该编写器执行完整备份。

备份邮票

增量备份和差异备份始终绑定到以前的备份。 有两种方法可以绑定备份。 对于简单的数据存储,请求者可以跟踪备份之间的关联。 但是,对于更复杂的数据存储,编写器需要使用备份来维护自己的时间戳;此时间戳可以跟踪日志位置、检查点信息等。 请求者可以通过检查 IVssExamineWriterMetadata::GetBackupSchema 返回的值中的VSS_BS_TIMESTAMPED位来确定给定编写器是否需要存储自己的时间戳。

在备份中存储时间戳的编写器会在处理 IVssBackupComponents::P repareForBackup 或处理 IVssBackupComponents::D oSnapshotSet 时添加时间戳。 请求者可以通过调用 IVssComponent::GetBackupStamp 来获取此时间戳。 执行增量备份或差异备份时,请求者需要将当前备份绑定到以前的备份。 这是通过从特定组件的上一个备份中获取时间戳并将其传递到 IVssBackupComponents::SetPreviousBackupStamp 函数来完成的;需要对在上一备份中备份的每个组件执行此操作。

备份文件

备份编写器报告的文件

编写器在 GatherWriterMetadata 阶段添加到其元数据的每个文件规范都包含一个备份类型掩码,该掩码指定何时应备份文件。 请求者通过调用 IVssWMFiledesc::GetBackupTypeMask 来确定此掩码是什么。 此掩码中的值用于确定需要备份文件规范的备份类型。 掩码可以包含以下一个或多个位值:

VSS_FSBT_FULL_BACKUP_REQUIRED

完整备份是必需的。

VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED

差异备份是必需的。

VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED

增量备份是必需的。

VSS_FSBT_LOG_BACKUP_REQUIRED

日志备份是必需的。

VSS_FSBT_ALL_BACKUP_REQUIRED

所有备份类型都是必需的;这是默认值。

此规范替代组件的选择性规范。 例如,请考虑一个组件,其文件都标有 VSS_FSBT_LOG_BACKUP_REQUIRED ,但未标记为 VSS_FSBT_FULL_BACKUP_REQUIRED。 假设当 IVssCreateWriterMetadata::AddComponent 调用) 时,无法为备份选择此组件 (bSelectable 为 false。 对于日志备份,这意味着必须始终备份此组件中的所有文件。 但是,在完整备份的情况下,无需备份任何文件,尽管组件的选择性意味着应该备份它。

按上次修改时间备份

IVssBackupComponents::GatherWriterMetadata 阶段中指定的文件规范信息不会向请求者提供有关自上次备份以来发生更改的内容的信息。 编写器指示对请求者的更改的一种方法是使用差异文件机制。 编写器可以指定仅当组件中的某些文件自某个时间以来已修改时才应备份;编写器可以在 IVssBackupComponents::P repareForBackupIVssBackupComponents::D oSnapshotSet 中指定这些文件。 请求者可以通过调用 IVssComponent::GetDifferencedFilesCountIVssComponent::GetDifferencedFile 来确定这些文件。 如果文件规范与 IVssBackupComponents::GatherWriterMetadata (中的一个集匹配,则根据备份类型掩码) 差异的文件信息将替代上述信息;也就是说,仅当自指定时间以来已修改文件规范时,才会备份与该文件规范匹配的文件。 上次修改时间是使用 FILETIME 结构进行通信的。 如果此结构的值为零,则表示应根据请求者上次备份时间记录确定上次修改时间。

部分文件备份

编写器指示对请求者的更改的另一种方法是使用部分文件机制。 编写器可以在需要备份的组件文件中指定字节范围;编写器可以在 IVssBackupComponents::P repareForBackupIVssBackupComponents::D oSnapshotSet 中指定这些文件范围。 请求者可以通过调用 IVssComponent::GetPartialFileCountIVssComponent::GetPartialFile 来确定这些文件。 IVssComponent::GetPartialFile 将返回指向该文件的路径和文件名,以及一个范围字符串,指示需要在文件中备份的内容。 与差异文件一样,如果路径和文件名与 IVssBackupComponents::GatherWriterMetadata 中的编写器设置的文件规范匹配,则部分文件信息将替代上一设置。 范围字符串可以有两种格式:它可以直接指定区域,也可以指定包含范围信息的文件。 如果直接指定范围,则语法是格式 offset1:length1、offset2:length2 的逗号分隔列表,其中每个偏移量和长度为 64 位无符号整数。 如果指定区域文件,则范围字符串应设置为 File= 文件名,其中 文件名 是范围文件的完整路径。 范围文件本身是格式化为 64 位无符号整数列表的二进制文件。 第一个整数指示文件中表示的范围。 每个后续整数配对表示范围的偏移量和长度。 请求者还必须注意备份和还原此范围文件。

文件规范规则

通过差异文件添加的文件规范和部分文件机制将修改 IVssBackupComponents::GatherWriterMetadata 中设置的文件规范,或添加全新的文件。 如果使用分部文件机制修改 IVssBackupComponents::GatherWriterMetadata 中设置的文件规范,则请求者可以期望文件规范与 IVssBackupComponents::GatherWriterMetadata 中的组件中设置的文件规范完全匹配。 文件规范不会部分重叠另一个文件规范,它与任何其他编写器组件中的任何文件规范不匹配。 但是,使用部分文件机制添加的文件规范可以部分重叠另一个文件规范。 如果为 true,则 differenced-file 或 partial-file 规范将替代 IVssBackupComponents::GatherWriterMetadata 中的规范集。 常规文件规范可以具有 IVssWMFiledesc::GetAlternateLocation () 返回的备用位置值,该值指示在备份时从中获取文件的备用位置。 如果通过差异文件或部分文件机制设置的文件规范与具有备用位置的现有文件规范匹配,则应从此备用位置选取数据。 如果通过差异文件或部分文件机制设置的文件规范与组件的任何现有规范不匹配,则现在应将这些文件范围添加到备份中。 请求者预计,只有卷影副本集中已包含的文件才会使用这些机制之一进行添加。

在没有卷影副本的情况下备份

某些类型的文件可能不需要从卷影副本卷备份。 例如,这通常是数据库日志文件的 true。 由于日志文件以单调方式增长,编写器可以确切地指定使用部分文件备份的文件部分,因此通常可以备份原始卷的日志。 作为优化,编写器可以使用备份类型掩码标记需要不同备份类型的卷影副本的文件。 从 IVssWMFiledesc::GetBackupTypeMask 返回的值可以包含以下一个或多个位值:

VSS_FSBT_FULL_SNAPSHOT_REQUIRED

完整备份所需的卷影副本。

VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

差异备份所需的卷影副本。

VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED

增量备份所需的卷影副本。

VSS_FSBT_LOG_SNAPSHOT_REQUIRED

日志备份所需的卷影复制。

VSS_FSBT_ALL_SNAPSHOT_REQUIRED

所有备份类型所需的卷影复制;这是默认值。

如果特定卷仅包含不需要此备份卷影副本的组件,则请求者可以跳过为此卷创建卷影副本的步骤。 可以将此卷上的所有数据直接从原始卷复制到备份介质。

还原文件

顺序还原

执行还原操作后,请求者会将 PostRestore 事件发送到所有编写器。 通常,编写器通过执行恢复或其他帖子还原操作来处理此事件。 但是,增量备份的还原通常作为一系列还原操作进行,每个增量备份一次。 请求者需要通知编写器,此类还原正在进行,以防止恢复或其他不良操作发生,直到完全完成还原。 这是通过调用 IVssBackupComponents::SetAdditionalRestores 来完成的。 此方法按组件调用,并向编写器指示该组件要进行更多还原。 对于序列中的最终还原,其他还原标志应设置为 false (其默认值) ,这表示这是该组件的序列中的最后一次还原。

新目标

如果编写器支持,请求者可以将数据文件还原到原始备份时间位置以外的位置。 请求者可以通过调用 IVssExamineWriterMetadata::GetBackupSchema 来检查此支持。 如果编写器支持此行为,将设置 VSS_BS_WRITER_SUPPORTS_NEW_TARGET 位。 请求者通过为每个重新定位的文件规范调用 IVssBackupComponents::AddNewTarget 来通知编写器新位置。 请求者还可以决定将特定范围文件还原到其他位置。 请求者通过调用 IVssBackupComponents::SetRangesFilePath 通知编写者此更改。

定向目标

对于复杂的还原方案,编写器可能需要将备份文件的范围映射到相同或不同文件的不同范围。 这可以通过使用定向目标机制来完成。 请求者可以在 IVssBackupComponents::P reRestore 阶段确定此机制正用于组件,方法是调用 IVssComponent::GetRestoreTarget 并检查 是否返回VSS_RT_DIRECTED。 请求者可以通过调用 IVssComponent::GetDirectedTargetCountIVssComponent::GetDirectedTarget 来获取所有这些重定向还原。 IVssComponent::GetDirectedTarget 将返回备份上源文件的完整路径,以及要还原到的目标文件的完整路径。 它还返回其中每个文件的范围列表。 然后,请求者负责将源文件中的指定范围还原到目标文件中的映射范围。 范围字符串的格式与 IVssComponent::GetPartialFile 中的格式相同。