编写器错误和否决
编写器可能会由于多种编程原因而失败。 发生这种情况时,它应通过调用 CVssWriter::SetWriterFailure 方法之一中的 CVssWriter::SetWriterFailure 方法, (CVssWriter::OnFreeze 或 CVssWriter::OnPreRestore) 并返回 TRUE 来否决正在进行的备份、还原或卷影复制操作。 它还可以选择使用 IVssComponentEx::SetPrepareForBackupFailureMsg、IVssComponentEx::SetPostSnapshotFailureMsg、IVssComponent::SetPreRestoreFailureMsg 和 IVssComponent::SetPostRestoreFailureMsg 方法来响应某些处理程序方法中的失败条件。 请求者可以接受否决,也可以继续备份,忽略否决。
请求者应使用 IVssBackupComponents::GatherWriterStatus 和 IVssBackupComponents::GetWriterStatus 检查编写器 (状态,) 其生成的每个事件。
在某些情况下,可以使用 IVssComponentEx::GetPrepareForBackupFailureMsg、IVssComponent::GetPreRestoreFailureMsg 从这些 (失败中检索错误消息, IVssComponentEx::GetPostSnapshotFailureMsg 和 IVssComponent::GetPostRestoreFailureMsg 方法) ,或者编写器可以选择使用 IVssComponent::SetRestoreMetadata 和 IVssComponent::SetBackupMetadata 设置 (元数据) 。 有关演示如何查看此类错误消息的示例代码,请参阅 IVssComponentEx::GetPrepareForBackupFailureMsg。
根据错误状态,请求者或其操作员可以重启备份和卷影副本,同时对备份作业或系统的状态进行任何必要的修改。
例如,假设 GetWriterStatus 返回了以下内容:
VSS_E_WRITERERROR_INCONSISTENTSNAPSHOT 建议请求者可能会向卷影副本添加其他卷
VSS_E_WRITERERROR_RETRYABLE 指示无需重新配置即可重试。 如果编写器在多次重试后继续返回错误,请尝试重启承载编写器的服务。 以下编写器托管在 VSS 服务中:注册表编写器、COM+ 类注册数据库编写器、卷影副本优化编写器以及自动系统恢复 (ASR) 编写器。 如果编写器属于在其自己的进程中托管编写器的应用程序,请尝试重启应用程序。
Windows Server 2003 和 Windows XP:以下编写器托管在 VSS 服务中:注册表编写器、COM+ 类注册数据库编写器、应用程序事件日志编写器以及 Microsoft SQL Server 2000 桌面引擎 (MSDE) 编写器。
VSS_E_WRITER_STATUS_NOT_AVAILABLE表示编写器可能已达到可用备份和还原会话的最大数目,当系统不太繁忙时,重试可能会起作用。
VSS_E_WRITERERROR_OUTOFRESOURCES 或 VSS_E_WRITERERROR_TIMEOUT 可能建议在重试之前降低系统负载
VSS_E_WRITERERROR_NONRETRYABLE 或 VSS_E_WRITER_NOT_RESPONDING 可能表示编写器错误严重到阻止尝试使用 VSS 备份其数据。
根据生成它们的编写器以及生成它们的组件,备份应用程序并不总是需要在否决或错误后中止。
例如,请求者可能决定卷影副本的意图是备份应用程序 A,并且已从编写器收到备份应用程序 B 的否决权。在这种情况下,在忽略否决的情况下继续备份申请 A 是完全可以接受的。
下面是编写者否决的示例:
- 当在创建卷影副本期间无法暂停其活动时,编写器将否决卷影副本创建过程。 这表示卷影副本无效的可能性很大,因为在冻结状态期间发生了写入操作。
- 备份应用程序只请求卷 C: 的卷影副本,编写器确定 C: 和 D: 的卷影副本要备份其数据。 在这种情况下,作者将否决。 备份应用程序可能会检查元数据,并确定是忽略编写器,还是将中止卷影副本创建过程,然后再重新启动。