VSS 增量备份和差异备份中的编写者角色

编写器通常会在处理 Identify (CVssWriter::OnIdentify) 、 PrepareForBackup (CSVsWriter:OnPrepareBackup) 和 PostSnapshot (CVssWriter:OnPostSnapshot) 事件时参与增量备份和差异备份。 编写器参与的方式由它是否支持备份标记和上次修改时间以及运行备份的请求者是否支持 部分文件操作决定。

处理增量备份和差异备份期间的标识事件

处理 Identify 事件时,编写器通过备份架构 (VSS_BACKUP_SCHEMA) 和文件规范备份类型 (VSS_FILE_SPEC_BACKUP_TYPE) 掩码 建立增量和差异备份操作的基本体系结构。

编写器通过创建 VSS_BACKUP_SCHEMA 值的位掩码并将其传递给 IVssCreateWriterMetadata::SetBackupSchema 方法,指示其在其编写器元数据文档中支持哪些操作。 通过此操作,编写器可以指示它是否支持以下内容:

  • 增量备份 (VSS_BS_INCREMENTAL)
  • 差异备份 (VSS_BS_DIFFERENTIAL)
  • 增量备份和差异备份不能混合 (VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL)
  • 使用备份标记的增量备份和差异备份 (VSS_BS_TIMESTAMPED)
  • 增量备份和差异备份基于文件的上次修改 (VSS_BS_LAST_MODIFY)

编写器使用文件规范备份类型掩码向请求者提供文件集级别信息,说明如何在增量备份或差异备份中包含文件。

编写器可以在将文件集添加到组件时设置文件集的文件规范备份类型掩码,方法是创建 VSS_FILE_SPEC_BACKUP_TYPE 值的位掩码并将其传递给 IVssCreateWriterMetadata::AddDatabaseFilesIVssCreateWriterMetadata::AddDatabaseLogFilesIVssCreateWriterMetadata::AddFilesToFileGroup

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

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

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

默认情况下,文件集添加到文件规范备份类型 为 VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED 的组件。 因此,除非编写器开发人员通过选择其他文件规范备份类型、使用部分文件操作或使用差异文件) 决定不使用默认 (,否则大多数文件集中的文件通常会全部复制到备份介质。

此时,编写器的编写器元数据文档已完全填充了请求者启动差异备份或增量备份所需的大部分信息。 在 PrepareForBackup 事件期间,将处理支持备份的文件集或文件级别信息的附加规范。

在增量备份和差异备份期间处理 PrepareForBackup 事件

在请求者继续执行实际备份操作之前,编写器可以通过 IVssComponent 接口更改请求者的备份组件文档来修改增量备份或差异备份的规范。

由于编写器使用 IVssComponent 接口,因此它们通常在处理 PrepareForBackup 事件时执行这些准备。

CVssWriter:OnPrepareBackup 中,编写器可以更精确地指定如何评估某些文件进行备份、指定备份时应使用的机制,以及可能设置备份标记。

部分文件

如果请求者支持它们,编写器可以选择使用部分文件操作实现增量备份或差异备份。 (编写器可以通过调用 CVssWriter::IsPartialFileSupportEnabled.) 来确定请求者是否支持部分文件操作

编写器使用 IVssComponent::AddPartialFile 来指示在增量或差异操作期间要备份的选定文件的那些部分。 请求者必须遵守此规范,并且必须始终备份文件的指定部分。 (有关 部分文件 操作的详细信息,请参阅使用部分文件。)

使用 IVssComponent::AddPartialFile,编写器可以将以前未添加到 (IVssCreateWriterMetadata::AddDatabaseFiles、IVssCreateWriterMetadata::AddDatabaseLogFilesIVssCreateWriterMetadata::AddFilesToFileGroup) 添加为部分文件的文件的备份。 以这种方式添加到备份的任何新文件都必须位于已为此备份进行卷影复制的卷上。

如果文件涉及部分文件操作,这将取代任何被忽略的文件规范备份类型。

差异文件

支持上次修改的备份架构 (VSS_BS_SCHEMA) 的编写器可以将 差异文件 添加到增量备份或差异备份。

在指定差异文件时,编写器使用 IVssComponent::AddDifferencedFileByLastModifyTime 并指定路径、文件名和递归标志,但是,它们不必与任何组件中包含的文件集匹配。

事实上,编写器可以将以前未添加到其组件集之一的文件, (IVssCreateWriterMetadata::AddDatabaseFilesIVssCreateWriterMetadata::AddDatabaseLogFilesIVssCreateWriterMetadata::AddFilesToFileGroup) 作为差异文件添加到备份。 以这种方式添加到备份的任何新文件都必须位于已为此备份进行卷影复制的卷上。

通常,编写器还会根据编写器自己的历史记录机制指定添加差异文件时的上次修改时间。 最后一次修改时间(如果指定)必须始终由请求者用于确定文件是否需要包含在增量备份还是差异备份中。

将差异文件添加到增量备份集或差异备份集时,编写器可以选择不指定上次修改时间。 如果是这种情况,请求者可以自由使用自己的机制(例如,以前的备份日志或文件系统信息),以确定差异文件是否应包含在增量备份或差异备份中。

将忽略任何差异文件的文件规范备份类型。

备份标记

支持备份标记 (VSS_BS_TIMESTAMP) 具有自己的专用格式,用于存储有关上次备份时间的信息。 此信息由编写器在备份期间生成。

备份标记通过 IVssComponent::SetBackupStamp 方法以字符串的形式存储在备份组件文档中。 备份标记适用于组件 (或组件集中的所有文件集,) 对应于 IVssComponent 实例。

如果请求者有权访问上一个备份的备份标记,则它将通过调用 IVssBackupComponents::SetPreviousBackupStamp 使其可供编写器使用。

然后,编写器可以使用 IVssComponent::GetPreviousBackupStamp 检查此时间戳。

请注意,请求者仅存储并返回包含备份标记的字符串。 它不知道字符串的格式或如何使用它;只有编写器具有该信息。

编写器在调用 IVssComponent::GetPreviousBackupStamp 后,可以选择使用 IVssComponent::SetBackupStamp 更新当前备份标记,从而以自己的格式记录当前增量备份或差异备份操作的日期。