備份複雜存放區中的寫入器角色

如同 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中設定資訊來指出此情況。

寫入器會在處理Identify事件時呼叫IVssCreateWriterMetadata::SetBackupSchema來指出支援哪種類型的備份。 IVssCreateWriterMetadata::SetBackupSchema方法的dsSchemaMask參數是位元遮罩,指出支援的備份類型。 所有寫入器都必須支援完整備份。

VSS_BS_DIFFERENTIAL

表示支援差異備份。

VSS_BS_INCREMENTAL

表示支援增量備份。

VSS_BS_LOG

表示支援記錄備份。

VSS_BS_COPY

表示支援複本備份。

VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL

表示寫入器不支援混合增量備份與差異備份。

寫入器可以呼叫 CVssWriter::GetBackupType來判斷正在執行的備份類型。 在處理 PrepareForBackup 事件時,最早可以執行此動作的時間點。 CVssWriter::GetBackupType 會傳回 VSS_BACKUP_TYPE 列舉的成員。 如果寫入器不支援備份類型,則寫入器應該將備份視為完整備份。

備份戳記

增量和差異備份一律會系結至先前的備份。 有兩種方式可以系結備份。 對於簡單的資料存放區,要求者可以追蹤備份之間的相互關聯。 不過,對於更複雜的資料存放區,寫入器將需要使用備份來維護自己的時間戳記;此時間戳記可能會追蹤記錄位置、檢查點資訊等等。 寫入器會在呼叫IVssCreateWriterMetadata::SetBackupSchema時設定VSS_BS_TIMESTAMPED位,以指出它需要自己的時間戳記。

寫入器可以儲存時間戳記,其中包含要備份的每個元件。 寫入器會藉由呼叫 IVssComponent::SetBackupStamp來儲存時間戳記,並傳入 wszBackupStamp 參數戳記的字串表示。 一般而言,寫入器會在處理 PostSnapshot 事件時呼叫這個方法。 不過,對於不涉及陰影複製的備份,將不會傳送 PostSnapshot 事件。 在此情況下,必須在處理PrepareForBackup事件時呼叫IVssComponent::SetBackupStamp

執行增量或差異備份時,要求者會向寫入器指出先前備份的備份戳記,做為此備份的基礎。 寫入器可以藉由呼叫 IVssComponent::GetPreviousBackupStamp,在處理 PrepareForBackup 或 PostSnapshot 事件時存取這個先前的備份戳記。 寫入器可以使用傳回的戳記來判斷需要備份的內容。

備份策略

檔案備份檔策略

寫入器中繼資料中報告的特定檔案通常只需要在執行特定類型的備份時備份。 某些檔案只有在執行完整備份時才需要。 只有在執行增量或差異備份時,才需要其他檔案。 VSS 會為寫入器提供方法,向要求者指出這項資訊。 使用 IVssCreateWriterMetadata::AddDatabaseFilesIVssCreateWriterMetadata::AddDatabaseLogFilesIVssCreateWriterMetadata::AddFilesToFileGroup將檔案新增至元件時, dwBackupTypeMask 參數會指出必須備份這些檔案的備份類型。 遮罩可以包含下列一或多個值:

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。 如果是記錄備份,這表示此元件中的所有檔案都必須一律備份。 不過,在完整備份的情況下,即使元件的選取性表示應該備份,也不需要備份任何檔案。

上次修改時間的備份

寫入器使用差異檔案機制來指出哪些檔案已變更的其中一種方式。 寫入器可以指定元件中的特定檔案只有在特定時間以來已經過修改時,才應該備份這些檔案。 寫入器會使用檔案規格和上次修改時間呼叫 IVssComponent::AddDifferencedFilesByLastModifyTimeIVssComponent::AddDifferencedFilesByLastModifyTime 通常會在處理 PostSnapshot 事件時呼叫,不過在處理 PrepareForBackup 事件時可以呼叫它。 然後,要求者必須備份符合自指定時間後變更之檔案規格的所有檔案。 如果寫入器使用備份戳記機制,則會根據備份檔案中先前的備份戳記來決定上次修改時間。 寫入器也可以在上次修改時間傳入零,這表示要求者負責判斷上次備份的時間,以及自該時間之後變更的檔案。

部分檔案備份

讓寫入器指出要求者變更的另一種方式是使用部分檔案機制。 寫入器可以在需要備份的元件檔案中指定位元組範圍;寫入器可能會在處理 PostSnapshot 或 PrepareForBackup 事件時指定這些檔案範圍。 寫入器會呼叫 IVssComponent::AddPartialFile ,將部分檔案規格新增至備份。 部分檔案規格包含路徑和檔案名,以及需要備份檔案中哪些範圍的相關資訊。

檔案規格規則

IVssComponent::AddDifferencedFilesByLastModifyTimeIVssComponent::AddPartialFile 可用來修改識別事件期間指定的檔案規格,或將全新的檔案新增至規格。 如果使用 IVssComponent::AddDifferencedFilesByLastModifyTime修改識別事件期間設定的資訊,則檔案規格必須完全符合目前元件中的其中一個檔案規格。 檔案規格不得部分重迭目前元件中的檔案,而且它不得與任何其他元件中的檔案相符。 不過,使用 IVssComponent::AddPartialFile 指定的檔案可以部分重迭另一個檔案規格。 IVssComponent::AddDifferencedFilesByLastModifyTimeIVssComponent::AddPartialFile所設定的資訊會覆寫稍早使用IVssCreateWriterMetadata介面來回應 Identify 事件所設定的資訊。

一般檔案規格可以透過IVssCreateWriterMetadata::AddFilesToFileGroup () 的 wszAlternateLocation參數所設定的替代位置值) ,指出在備份時間取得檔案的替代位置。 如果透過差異檔案或部分檔案機制設定的檔案規格符合具有替代位置的現有檔案規格,備份應用程式將會從這個替代位置取得資料。

如果在 IVssComponent::AddDifferencedFilesByLastModifyTimeIVssComponent::AddPartialFile 中設定的檔案規格不符合和正在備份的元件中的檔案,則所有相符的檔案現在都會新增至備份。 請務必小心,寫入器只會在執行此動作時,將存在於已複製陰影的磁片區上新增的檔案;否則,要求者可能會無法備份這些檔案。 如果在處理 PostSnapshot 事件時呼叫這些函式,則可以使用 CVssWriter::IsPathAffected 方法來判斷。 如果在處理 PrepareForBackup 事件時呼叫,寫入器必須使用其他方法進行此判斷。

沒有陰影複製的備份

某些類型的檔案可能不需要從陰影複製磁片區備份。 例如,這通常是資料庫記錄檔的 True。 由於記錄檔會以單調方式成長,而且寫入器可以確切指定要使用部分檔案備份的檔案部分,因此通常可能會從原始磁片區備份記錄檔。 作為優化,寫入器可以使用IVssCreateWriterMetadata::AddDatabaseFiles::AddDatabaseFiles::AddDatabaseLogFiles 或 IVssCreateWriterMetadata::AddVssCreateWriterMetadata::AddVssCreateWriterMetadata::AddFilesToFileGroup中設定的旗標,標記哪些檔案需要陰影複製。 支援的旗標包括下列專案:

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

所有備份類型所需的陰影複製;這是預設值。

如果特定磁片區只包含不需要此備份陰影複製的元件,則要求者可以略過為此磁片區建立陰影複製的步驟。 此磁片區上的所有資料都可以直接從原始磁片區複製到備份媒體。

備份清除

如果寫入器需要執行記錄截斷或其他備份後清除,則處理 BackupComplete 事件時要執行此動作的適當位置。 BackupShutdown 事件會在 BackupComplete 之後傳送一些時間,因此在 BackupShutdown 事件處理常式中也可以完成一些清除。

BackupShutdown 事件一律會在備份終止之後傳送。 如果要求者在執行備份時異常終止,則會立即傳送 BackupShutdown,而不需要先傳送 BackupComplete。 如果寫入器需要清除任何狀態,則可能在此完成;不過,記錄截斷不應該在此事件中發生,因為備份不一定完成。

還原策略

還原時寫入器的基本工作是確認還原可以在處理 PreRestore 事件時發生,而且還原已在處理 PostRestore 事件時發生。 更複雜的存放區也會在 PostRestore 處理常式中執行復原程式。 如果還原是增量或差異還原的一部分,寫入器通常會想要延遲此復原程式,直到所有增量或差異還原都已完成為止。 IVssComponent::GetAdditionalRestores 會指出這是此元件的最終還原,還是有更多還原。 如果 IVssComponent::GetAdditionalRestores 傳回 true,則寫入器不應該在該元件上執行其復原程式。

新目標

如果寫入器支援,要求者可以將資料檔案還原到原始備份時間位置以外的位置。 寫入器會藉由呼叫IVssCreateWriterMetadata::SetBackupSchemaSchema時,在dsSchemaMask參數中設定VSS_BS_WRITER_SUPPORTS_NEW_TARGET位,以指出此還原模式的支援。 寫入器會在還原時呼叫 IVssComponent::GetNewTargetCountIVssComponent::GetNewTarget來取得元件檔案的新位置。

導向目標

針對複雜的還原案例,寫入器可能會想要將備份檔案的範圍對應至相同或不同檔案的不同範圍。 這可以使用導向目的機制來完成。 若要這樣做,寫入器必須先呼叫IVssComponent::SetRestoreTarget,傳入目標參數的VSS_RT_DIRECTED,以指出發生此情況。 然後,針對每個對應,寫入器會呼叫 IVssComponent::AddDirectedTarget。 此方法會採用備份上來源檔案的完整路徑,以及將還原目的地檔案的完整路徑。 它也會針對每個檔案取得範圍清單。 寫入器會在處理 PreRestore 事件時呼叫這些函式,然後要求者負責將來源檔案中的指定範圍還原至目的地檔案中的對應範圍。 範圍字串的格式與IVssComponent::AddPartialFile的格式相同

私人寫入器中繼資料

寫入器通常會使用備份來維護私人中繼資料,以正確執行增量或差異還原。 寫入器可能會在處理 PrepareForBackup 或 PostSnapshot 以儲存中繼資料時呼叫 IVssComponent::SetBackupMetadata 。 在 PreRestore 或 PostRestore 期間,寫入器可以透過呼叫 IVssComponent::GetBackupMetadata來存取此中繼資料。 中繼資料也可以使用IVssComponent::AddPartialFilewszMetadata參數來儲存部分檔案規格;此中繼資料是透過IVssComponent::GetPartialFilepbstrMetadata參數來存取。 寫入器也可以將中繼資料傳遞至 CVssWriter::OnPreRestoreCVssWriter::OnPostRestore之間。 在 CVssWriter::OnPreRestore中,中繼資料是藉由呼叫 IVssComponent::SetRestoreMetadata 來設定。 在 CVssWriter::OnPostRestore中,會呼叫 IVssComponent::GetRestoreMetadata來擷取中繼資料。