Ruolo writer in backup di archivi complessi

Come per tutte le operazioni importanti in VSS, i backup incrementali e differenziali richiedono una stretta collaborazione tra i richiedenti e i writer.

Tipi di backup

L'infrastruttura offre un supporto speciale per cinque tipi di backup. Sono descritte come segue:

  • Completo (VSS_BT_FULL). Verrà eseguito il backup dei file indipendentemente dalla data dell'ultimo backup. La cronologia dei backup di ogni file verrà aggiornata e questo tipo di backup può essere usato come base di un backup incrementale o differenziale. Se sono presenti file di log, è possibile che vengano troncati in seguito a questo backup.

    Il ripristino di un backup completo richiede solo una singola immagine di backup.

  • Differenziale (VSS_BT_DIFFERENTIAL). L'API VSS viene usata per garantire che solo i file modificati o aggiunti dopo l'ultimo backup completo vengano copiati in un supporto di archiviazione; tutte le informazioni di backup intermedie vengono ignorate. Ciò può includere interi file o intervalli specifici all'interno dei file. Un backup differenziale è associato a un backup completo e in genere non può essere ripristinato finché il backup completo non è stato ripristinato. Se sono presenti file di log, in genere non verranno troncati in seguito a questo backup.

    Il ripristino di un backup differenziale richiede l'immagine di backup originale e l'immagine di backup differenziale più recente eseguita dall'ultimo backup completo.

  • Incrementale (VSS_BT_INCREMENTAL). L'API VSS viene usata per garantire che solo i file modificati o aggiunti dopo l'ultimo backup completo o incrementale vengano copiati in un supporto di archiviazione. Ciò può includere interi file o intervalli specifici all'interno dei file. Alcuni writer non consentono la combinazione di backup incrementali con backup differenziali. Se sono presenti file di log, è possibile che vengano troncati in seguito a questo backup.

    Il ripristino di un backup incrementale richiede l'immagine di backup originale e tutte le immagini di backup incrementali eseguite dal backup iniziale.

  • Backup del log (VSS_BT_LOG). Verrà eseguito il backup solo dei file di log di un writer (file aggiunti a un componente con il metodo IVssCreateWriterMetadata::AddDataBaseLogFiles e recuperati da una chiamata a IVssWMComponent::GetDatabaseLogFile). Questo tipo di backup è specifico di VSS. I backup del log tendono a essere eseguiti abbastanza frequentemente. In genere, il file di log verrà troncato in seguito a questo backup.

  • Copia backup (VSS_BT_COPY). Analogamente al tipo di backup VSS_BT_FULL, i file verranno sottoposti a backup indipendentemente dalla data dell'ultimo backup. Tuttavia, la cronologia dei backup di ogni file non verrà aggiornata e questo tipo di backup non può essere usato come base di un backup incrementale o differenziale. I file di log non devono mai essere troncati in seguito a un backup di copia.

Supporto di file parziali

Alcuni writer supportano il ripristino dei file tramite la sovrascrittura di parti dei file gestiti. Un richiedente può essere progettato per sfruttare questo vantaggio e, se lo indica, impostando le informazioni in IVssBackupComponents::SetBackupState.

I writer indicano il tipo di backup supportato chiamando IVssCreateWriterMetadata::SetBackupSchema durante l'elaborazione dell'evento Identify . Il parametro dsSchemaMask per il metodo IVssCreateWriterMetadata::SetBackupSchema è una maschera di bit che indica i tipi di backup supportati. Tutti i writer devono supportare backup completi.

VSS_BS_DIFFERENTIAL

Indica il supporto per i backup differenziali.

VSS_BS_INCREMENTAL

Indica il supporto per i backup incrementali.

VSS_BS_LOG

Indica il supporto per i backup del log.

VSS_BS_COPY

Indica il supporto per i backup di copia.

VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL

Indica che un writer non supporta la combinazione di backup incrementali con backup differenziali.

Il writer può determinare il tipo di backup eseguito chiamando CVssWriter::GetBackupType. Il primo punto in cui è possibile eseguire questa operazione è durante l'elaborazione dell'evento PrepareForBackup. CVssWriter::GetBackupType restituirà un membro dell'enumerazione VSS_BACKUP_TYPE . Se il tipo di backup non è supportato dal writer, il writer deve considerare il backup come backup completo.

Timbri di backup

I backup incrementali e differenziali sono sempre associati a un backup precedente. Esistono due modi per collegare i backup. Per gli archivi dati semplici, il richiedente può tenere traccia della correlazione tra i backup. Tuttavia, per archivi dati più complessi, il writer dovrà mantenere il proprio timestamp con il backup; questo timestamp può tenere traccia della posizione del log, delle informazioni sul checkpoint e così via. Un writer indica che richiede i propri timestamp impostando il bit VSS_BS_TIMESTAMPED quando chiama IVssCreateWriterMetadata::SetBackupSchema.

Un writer può archiviare un timestamp con ogni componente di cui viene eseguito il backup. Il writer archivia il timestamp chiamando IVssComponent::SetBackupStamp e passando una rappresentazione di stringa del timbro per il parametro wszBackupStamp . In genere, un writer chiamerà questo metodo durante l'elaborazione dell'evento PostSnapshot . Tuttavia, per i backup che non coinvolgono una copia shadow, l'evento PostSnapshot non verrà inviato. In questo caso, È necessario chiamare IVssComponent::SetBackupStamp durante l'elaborazione dell'evento PrepareForBackup .

Quando viene eseguito un backup incrementale o differenziale, il richiedente indicherà al writer il timbro di backup del backup precedente che funge da base per questo backup. Il writer può accedere a questo indicatore di backup precedente durante l'elaborazione dell'evento PrepareForBackup o PostSnapshot chiamando IVssComponent::GetPreviousBackupStamp. Il writer può utilizzare il timbro restituito per determinare quali elementi devono essere sottoposti a backup.

Strategie di backup

Strategie per i file di backup dei file

Spesso, alcuni file segnalati nei metadati del writer devono essere sottoposti a backup solo quando si eseguono determinati tipi di backup. Alcuni file possono essere necessari solo quando si esegue un backup completo. È possibile che altri file siano necessari solo quando si esegue un backup incrementale o differenziale. VSS fornisce un metodo per i writer per indicare queste informazioni al richiedente. Quando si aggiungono file ai componenti tramite IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles o IVssCreateWriterMetadata::AddFilesToFileGroup, il parametro dwBackupTypeMask indica per quali tipi di backup è necessario eseguire il backup di questi file. La maschera può contenere uno o più dei valori seguenti:

VSS_FSBT_FULL_BACKUP_REQUIRED

Obbligatorio per i backup completi.

VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED

Obbligatorio per i backup differenziali.

VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED

Obbligatorio per i backup incrementali.

VSS_FSBT_LOG_BACKUP_REQUIRED

Obbligatorio per i backup del log.

VSS_FSBT_ALL_BACKUP_REQUIRED

Obbligatorio per tutti i tipi di backup; si tratta dell'impostazione predefinita.

Questa specifica esegue l'override della specifica di selettività del componente. Si consideri ad esempio un componente i cui file sono tutti contrassegnati con VSS_FSBT_LOG_BACKUP_REQUIRED ma non con VSS_FSBT_FULL_BACKUP_REQUIRED. Si supponga che questo componente non sia selezionabile per il backup (bSelectable è false quando è stato chiamato IVssCreateWriterMetadata::AddComponent ). Nel caso di un backup del log, è necessario eseguire sempre il backup di tutti i file in questo componente. Tuttavia, nel caso di un backup completo, nessuno dei file deve essere sottoposto a backup, nonostante il fatto che la selettività del componente implica che deve essere eseguito il backup.

Ora di backup per ultima modifica

Un modo per consentire a un writer di indicare quali file sono stati modificati consiste nell'usare il meccanismo di file diverso. Un writer può specificare che è necessario eseguire il backup di determinati file in un componente solo se sono stati modificati da un determinato momento. Il writer chiama IVssComponent::AddDifferencedFilesByLastModifyTime con una specifica di file e un'ora dell'ultima modifica. IVssComponent::AddDifferencedFilesByLastModifyTime viene in genere chiamato durante l'elaborazione dell'evento PostSnapshot, anche se può essere chiamato durante l'elaborazione dell'evento PrepareForBackup. Il richiedente deve quindi eseguire il backup di tutti i file corrispondenti alla specifica del file modificata dall'ora specificata. Se il writer usa il meccanismo del timbro di backup, l'ora dell'ultima modifica verrà determinata in base al timbro di backup precedente nel documento di backup. Il writer può anche passare zero per l'ora dell'ultima modifica, che indica che il richiedente è responsabile di determinare l'ora dell'ultimo backup e i file modificati da quel momento.

Backup parziale dei file

Un altro modo per consentire a un writer di indicare le modifiche apportate al richiedente consiste nell'usare il meccanismo di file parziale. Un writer può specificare intervalli di byte all'interno di file di componente di cui è necessario eseguire il backup; il writer può specificare questi intervalli di file durante l'elaborazione dell'evento PostSnapshot o PrepareForBackup. Il writer chiama IVssComponent::AddPartialFile per aggiungere specifiche di file parziali al backup. Una specifica di file parziale è costituita da un percorso e un nome di file insieme alle informazioni sugli intervalli di cui è necessario eseguire il backup.

Regole specifiche dei file

IVssComponent::AddDifferencedFilesByLastModifyTime o IVssComponent::AddPartialFile possono essere usati entrambi per modificare le specifiche dei file fornite durante l'evento Identify o per aggiungere file completamente nuovi alla specifica. Se il writer modifica le informazioni impostate durante l'evento Identify usando IVssComponent::AddDifferencedFilesByLastModifyTime, la specifica del file deve corrispondere esattamente a una delle specifiche del file nel componente corrente. La specifica del file non deve sovrapporsi parzialmente ai file nel componente corrente e non deve corrispondere ai file in altri componenti. I file specificati usando IVssComponent::AddPartialFile possono tuttavia sovrapporsi parzialmente a un'altra specifica di file. Le informazioni impostate da IVssComponent::AddDifferencedFilesByLastModifyTime o IVssComponent::AddPartialFile sostituiscono il set di informazioni in precedenza usando l'interfaccia IVssCreateWriterMetadata in risposta all'evento Identify.

Le specifiche di file generali possono avere un valore di percorso alternativo (impostato dal parametro wszAlternateLocation di IVssCreateWriterMetadata::AddFilesToFileGroup) che indica un percorso alternativo da cui ottenere il file in fase di backup. Se la specifica del file impostata tramite i meccanismi di file con differenze o di file parziali corrisponde a una specifica di file esistente con un percorso alternativo, l'applicazione di backup otterrà i dati da questo percorso alternativo.

Se la specifica del file impostata in IVssComponent::AddDifferencedFilesByLastModifyTime o in IVssComponent::AddPartialFile non corrisponde e i file nel componente di cui viene eseguito il backup, tutti i file corrispondenti vengono ora aggiunti al backup. Occorre prestare attenzione al fatto che il writer aggiunge solo i file esistenti in un volume che è già in fase di copia shadow durante questa operazione; in caso contrario, il richiedente potrebbe non eseguire il backup di questi file. Se queste funzioni vengono chiamate durante l'elaborazione dell'evento PostSnapshot, è possibile determinarle usando il metodo CVssWriter::IsPathAffected . Se viene chiamato durante la gestione dell'evento PrepareForBackup, il writer deve effettuare questa determinazione usando un altro metodo.

Backup senza copia shadow

È possibile che non sia necessario eseguire il backup di determinati tipi di file da un volume di copia shadow. Ad esempio, questo vale spesso per i file di log del database. Poiché i file di log aumentano in modo monotonico e un writer può specificare esattamente quali parti del file eseguire il backup usando file parziali, spesso sarà possibile eseguire il backup del volume originale. Come ottimizzazione, un writer può contrassegnare i file che richiedono copie shadow per diversi tipi di backup usando i flag impostati nel parametro dwBackupTypeMask di IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles o IVssCreateWriterMetadata::AddFilesToFileGroup. I flag supportati includono quanto segue:

VSS_FSBT_FULL_SNAPSHOT_REQUIRED

Copia shadow necessaria per i backup completi.

VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

Copia shadow necessaria per i backup differenziali.

VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED

Copia shadow necessaria per i backup incrementali.

VSS_FSBT_LOG_SNAPSHOT_REQUIRED

Copia shadow necessaria per i backup del log.

VSS_FSBT_ALL_SNAPSHOT_REQUIRED

Copia shadow necessaria per tutti i tipi di backup; si tratta dell'impostazione predefinita.

Se un volume specifico contiene solo componenti che non richiedono una copia shadow per questo backup, il richiedente può ignorare il passaggio di creazione di una copia shadow per questo volume. Tutti i dati in questo volume possono essere copiati nel supporto di backup direttamente dal volume originale.

Pulizia backup

Se il writer deve eseguire il troncamento del log o un'altra pulizia post-backup, la posizione appropriata per eseguire questa operazione è durante l'elaborazione dell'evento BackupComplete . L'evento BackupShutdown verrà inviato un po' di tempo dopo BackupComplete, quindi è possibile eseguire alcune operazioni di pulizia anche nel gestore eventi BackupShutdown.

L'evento BackupShutdown viene sempre inviato dopo la chiusura di un backup. Se il richiedente termina in modo anomalo durante l'esecuzione di un backup, BackupShutdown verrà inviato immediatamente, senza prima inviare BackupComplete. Se il writer deve pulire qualsiasi stato, questo può essere fatto qui; Tuttavia, il troncamento del log non deve verificarsi in questo evento perché il backup non è stato necessariamente completato.

Strategie di ripristino

Le attività di base dei writer in fase di ripristino sono verificare che il ripristino possa verificarsi nella gestione dell'evento PreRestore e che il ripristino sia avvenuto nella gestione dell'evento PostRestore. Gli archivi più complessi eseguiranno anche un processo di ripristino nel gestore PostRestore. Se il ripristino fa parte di un ripristino incrementale o differenziale, il writer in genere vuole ritardare questo processo di ripristino fino al completamento di tutti i ripristini incrementali o differenziali. IVssComponent::GetAdditionalRestores indicherà se si tratta del ripristino finale di questo componente o se sono presenti più ripristini. Se IVssComponent::GetAdditionalRestores restituiscetrue, il writer non deve eseguire la procedura di ripristino su tale componente.

Nuove destinazioni

Se supportato dal writer, il richiedente può ripristinare i file di dati in un percorso diverso da quello originale. Un writer indica il supporto per questa modalità di ripristino impostando il bit VSS_BS_WRITER_SUPPORTS_NEW_TARGET nel parametro dsSchemaMask quando si chiama IVssCreateWriterMetadata::SetBackupSchema. Un writer ottiene i nuovi percorsi per i file dei componenti in fase di ripristino chiamando IVssComponent::GetNewTargetCount e IVssComponent::GetNewTarget.

Destinazioni dirette

Per scenari di ripristino complessi, un writer può voler eseguire il mapping di intervalli di un file di cui è stato eseguito il backup in intervalli diversi dello stesso file o di un file diverso. Questa operazione può essere eseguita usando il meccanismo di destinazione diretta. A tale scopo, un writer deve prima indicare che ciò avviene chiamando IVssComponent::SetRestoreTarget, passando VSS_RT_DIRECTED per il parametro di destinazione . Quindi, per ogni mapping, il writer chiama IVssComponent::AddDirectedTarget. Questo metodo accetta un percorso completo di un file di origine nel backup e un percorso completo di un file di destinazione in cui verrà ripristinato. Accetta anche un elenco di intervalli per ognuno di questi file. Il writer chiama queste funzioni durante la gestione dell'evento PreRestore e il richiedente è quindi responsabile del ripristino degli intervalli specificati nel file di origine negli intervalli mappati nel file di destinazione. Il formato della stringa degli intervalli è uguale a quello di IVssComponent::AddPartialFile

Metadati del writer privato

Spesso è utile per un writer gestire metadati privati con un backup per eseguire correttamente un ripristino incrementale o differenziale. Un writer può chiamare IVssComponent::SetBackupMetadata durante la gestione di PrepareForBackup o PostSnapshot per archiviare i metadati. È possibile accedere a questi metadati dal writer durante PreRestore o PostRestore chiamando IVssComponent::GetBackupMetadata. I metadati possono anche essere archiviati con specifiche di file parziali usando il parametro wszMetadata di IVssComponent::AddPartialFile; è possibile accedere a questi metadati tramite il parametro pbstrMetadatadi IVssComponent::GetPartialFile. Il writer può anche passare metadati a se stesso tra CVssWriter::OnPreRestore e CVssWriter::OnPostRestore. In CVssWriter::OnPreRestore i metadati vengono impostati chiamando IVssComponent::SetRestoreMetadata. In CVssWriter::OnPostRestore i metadati vengono recuperati chiamando IVssComponent::GetRestoreMetadata.