備份前工作概觀
VSS 下的預先備份工作著重于建立包含備份資料的磁片區陰影複本。 備份應用程式會儲存來自陰影複製的資料,而不是實際磁碟區。 如需詳細資訊,請參閱 在 VSS 下處理備份的概觀。
要求者通常會等候寫入器準備備份和建立陰影複製。 寫入器必須判斷它是否要參與備份,如果是,請將其檔案和本身設定為準備好進行備份和陰影複製。 下表顯示準備備份作業所需的動作和事件順序。
要求者預先備份工作
此外,在建立 IVssBackupComponents::P repareForBackup 事件之前,要求者也可以使用 IVssBackupComponents::SetBackupOptions 來 設定個別寫入器的備份選項,視每個寫入器的特定情況以及要求者是否知道它們而定。
為了支援累加和差異作業,要求者此時可以選擇使用 IVssComponent::GetBackupStamp) 檢查舊版備份 (作業的時間戳記元件,並使用該資訊來設定寫入器先前的時間戳記,以使用 IVssBackupComponents::SetPreviousBackupStamp) 來處理 (。 如需詳細資訊,請參閱 增量和差異備份 。
要求者現在可以指示系統的寫入器完成備份前準備,以及處理陰影複製的建立。
首先,要求者會呼叫IVssBackupComponents::P repareForBackup來產生PrepareForBackup事件。
當所有參與的寫入器都從處理PrepareForBackup事件 (要求者使用PrepareForBackup所傳回的IVssAsync介面實例來決定) 之後, 要求者可以藉由呼叫IVssBackupComponents::D oSnapshotSet來起始陰影複製,當它進行時,將會產生PrepareForSnapshot、Freeze、Thaw和PostSnapshot事件,以供寫入器處理。
在某些情況下,要求者可能不需要建立陰影複製。 具體來說,由其中一個指定寫入器元件管理的檔案集都有一個檔案規格備份遮罩, (以識別事件期間所設定) VSS_FILE_SPEC_BACKUP_TYPE值的位 OR 表示。 此遮罩會指定檔案集是否需要在執行備份之前複製系統。
如果未在任何磁片區上備份任何檔案集需要陰影複製,則不需要呼叫 IVssBackupComponents::D oSnapshotSet 。
寫入器預先備份工作
處理 PrepareForBackup 事件時,VSS 會呼叫每個寫入器的 CVssWriter::OnPrepareBackup 方法,此虛擬方法預設只會傳回 true。
寫入器可以覆寫此預設實作,並使用處理來尋找即將進行備份並採取動作的相關資訊。
寫入器可以使用下列方法來判斷備份作業類型的相關資訊:
寫入器會使用 CVssWriter::IsPathAffected判斷其管理的檔案是否涉及陰影複製。
更重要的是,當 VSS 呼叫 CVssWriter::OnPrepareBackup 方法時,它會傳入 IVssWriterComponents 介面的實例,允許透過 IVssComponent 介面直接存取要求者備份元件檔中 明確包含 的元件。 寫入器使用定義元件集以存取其隱含元件集的IVssComponent介面實例, (請參閱可選取性和使用元件屬性) 。
在 PrepareForBackup 事件的處理期間,寫入器會使用 IVssComponent 介面來執行元件 (或元件集) 作業所設定的元件集,包括:
- 藉由呼叫IVssComponent::AddPartialFile, (新增部分檔案) 。
- 設定寫入器需要處理還原的任何私人中繼資料。
- 如果寫入器支援增量和差異備份 (請參閱 增量和差異備份) ,請執行下列動作:
- 呼叫 IVssComponent::GetPreviousBackupStamp來檢查先前的備份時間戳記。
- 呼叫IVssComponent::AddDifferencedFilesByLastModifyTime來新增任何必要的差異檔案。
- 如果寫入器支援 VSS_BS_TIMESTAMPED 架構,請使用 IVssComponent::SetBackupStamp,在寫入器自己的格式中新增備份時間戳記字串。
- 起始非常耗時的非同步作業,例如跨多個磁片同步處理資料。 這可讓寫入器在處理作業時繼續運作,包括處理其他 VSS 事件。 這些作業必須在 Freeze 事件之前終止。
要求者的 IVssBackupComponents::D oSnapshotSet 呼叫會起始陰影複製,並產生下列事件供寫入器處理:
寫入器的三個處理常式:CVssWriter::OnPrepareSnapshot、 CVssWriter::OnFreeze和 CVssWriter::OnThaw,都是純虛擬方法,而且每個寫入器都必須實作它們,而不是依賴預設值。 根據寫入器的需求,它們可能會編碼為虛擬方法,只要傳回 TRUE即可。
由於發行 凍結 事件和 解除凍結 事件之間的時間範圍通常很窄,所以準備陰影複製的大部分主要工作,例如關閉進程、建立暫存檔案或清空 I/O 佇列,都會在 CVssWriter::OnPrepareSnapshot中處理。
寫入器如何使用 CVssWriter::OnPrepareSnapshot 來處理其 I/O,再建立陰影複製與寫入器自己的架構高度相依。
在 凍結之前,能夠容納所有寫入並讓資料保持絕對一致狀態的寫入器應該這麼做。
如果寫入器無法凍結其 I/O,則應該採取動作來建立備份的穩定來源,並減少陰影複製的復原時間。 這的範例可能包括佇列傳入 I/O 要求,或在 替代路徑 中產生重複的檔案集,以作為備份的來源。
CVssWriter::OnFreeze方法會執行簡單、簡短的工作,例如驗證CVssWriter::OnPrepareSnapshot是否處於正確的狀態,以及CVssWriter::OnPrepareBackup所啟動的任何非同步工作都已完成。 如果發生問題, (看到 寫入器錯誤和 Vetoes) 發生問題,這個方法是寫入器的最後一個機會。
在 Thaw 事件之後,寫入器通常會繼續正常作業:陰影複製可能無法立即準備好在 Thaw 之後進行備份,但寫入器應該能夠繼續正常作業。 因此,通常 CVssWriter::OnThaw 是由寫入器用來返回凍結前狀態。 不過,為了支援陰影複製而建立的任何暫存檔都應該保留到 PostSnapshot 事件為止。 一般而言,您會使用 CVssWriter::OnPostSnapshot 進行這類清除。 由於許多應用程式不需要這種清除, 因此 CVssWriter::OnPostSnapshot 是一種虛擬方法,其預設實作只會傳回 TRUE。 如果正在執行增量或差異備份,寫入器可能會呼叫 IVssComponent::GetPreviousBackupStamp 和 IVssComponent::SetBackupStamp。 如需詳細資訊,請參閱 備份複雜存放區中的寫入器角色。 目前可以呼叫的另一種方法是 IVssComponent::AddDifferencedFilesByLastModifyTime。