Função de gravador no backup de repositórios complexos

Assim como acontece com todas as operações importantes no VSS, backups incrementais e diferenciais exigem uma estreita cooperação entre solicitantes e gravadores.

Tipos de backup

A infraestrutura fornece suporte especial para cinco tipos de backup. Elas são descritas da seguinte maneira:

  • Completo (VSS_BT_FULL). Os arquivos serão copiados em backup independentemente da última data de backup. O histórico de backup de cada arquivo será atualizado e esse tipo de backup pode ser usado como base de um backup incremental ou diferencial. Se houver arquivos de log, eles poderão ser truncados como resultado desse backup.

    Restaurar um backup completo requer apenas uma única imagem de backup.

  • Diferencial (VSS_BT_DIFFERENTIAL). A API do VSS é usada para garantir que somente os arquivos que foram alterados ou adicionados desde o último backup completo sejam copiados para um meio de armazenamento; todas as informações intermediárias de backup são ignoradas. Isso pode incluir arquivos inteiros ou intervalos específicos dentro de arquivos. Um backup diferencial é associado a um backup completo e geralmente não pode ser restaurado até que o backup completo seja restaurado. Se houver arquivos de log, eles geralmente não serão truncados como resultado desse backup.

    Restaurar um backup diferencial requer a imagem de backup original e a imagem de backup diferencial mais recente feita desde o último backup completo.

  • Incremental (VSS_BT_INCREMENTAL). A API do VSS é usada para garantir que apenas os arquivos que foram alterados ou adicionados desde o último backup completo ou incremental sejam copiados para um meio de armazenamento. Isso pode incluir arquivos inteiros ou intervalos específicos dentro de arquivos. Alguns gravadores não permitem que backups incrementais sejam misturados com backups diferenciais. Se houver arquivos de log, eles poderão ser truncados como resultado desse backup.

    Restaurar um backup incremental requer a imagem de backup original e todas as imagens de backup incrementais feitas desde o backup inicial.

  • Backup de log (VSS_BT_LOG). Somente os arquivos de log de um gravador (arquivos adicionados a um componente com o método IVssCreateWriterMetadata::AddDataBaseLogFiles e recuperados por uma chamada para IVssWMComponent::GetDatabaseLogFile) serão submetidos ao backup. Esse tipo de backup é específico do VSS. Os backups de log tendem a ser feitos com bastante frequência. Normalmente, o arquivo de log será truncado como resultado desse backup.

  • Copiar Backup (VSS_BT_COPY). Assim como o tipo de backup VSS_BT_FULL, os arquivos serão copiados em backup independentemente da última data de backup. No entanto, o histórico de backup de cada arquivo não será atualizado e esse tipo de backup não pode ser usado como base de um backup incremental ou diferencial. Os arquivos de log nunca devem ser truncados como resultado de um backup de cópia.

Suporte a arquivos parciais

Alguns gravadores dão suporte à restauração de arquivos por meio da substituição de partes dos arquivos que gerenciam. Um solicitante pode ser projetado para aproveitar isso e, nesse caso, indica isso definindo as informações em IVssBackupComponents::SetBackupState.

Os gravadores indicam que tipo de backups têm suporte chamando IVssCreateWriterMetadata::SetBackupSchema durante o processamento do evento Identifi . O parâmetro dsSchemaMask para o método IVssCreateWriterMetadata::SetBackupSchema é uma máscara de bits que indica quais tipos de backup têm suporte. Todos os gravadores devem dar suporte a backups completos.

VSS_BS_DIFFERENTIAL

Indica suporte para backups diferenciais.

VSS_BS_INCREMENTAL

Indica suporte para backups incrementais.

VSS_BS_LOG

Indica suporte para backups de log.

VSS_BS_COPY

Indica suporte para backups de cópia.

VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL

Indica que um gravador não dá suporte à combinação de backups incrementais com backups diferenciais.

O gravador pode determinar que tipo de backup está sendo executado chamando CVssWriter::GetBackupType. O ponto mais antigo em que isso pode ser executado é durante o processamento do evento PrepareForBackup. CVssWriter::GetBackupType retornará um membro da enumeração VSS_BACKUP_TYPE . Se o tipo de backup não tiver suporte do gravador, o gravador deverá tratar o backup como um backup completo.

Selos de Backup

Backups incrementais e diferenciais são sempre vinculados a um backup anterior. Há duas maneiras de vincular backups. Para armazenamentos de dados simples, o solicitante pode acompanhar a correlação entre backups. No entanto, para armazenamentos de dados mais complexos, o gravador precisará manter seu próprio carimbo de data/hora com o backup; esse carimbo de data/hora pode acompanhar a posição do log, as informações de ponto de verificação e assim por diante. Um gravador indica que ele precisa de seus próprios carimbos de data/hora definindo a VSS_BS_TIMESTAMPED bit quando chama IVssCreateWriterMetadata::SetBackupSchema.

Um gravador pode armazenar um carimbo de data/hora com cada componente que está sendo feito backup. O gravador armazena o carimbo de data/hora chamando IVssComponent::SetBackupStamp e passando uma representação de cadeia de caracteres do carimbo para o parâmetro wszBackupStamp . Em geral, um gravador chamará esse método durante o processamento do evento PostSnapshot . No entanto, para backups que não envolvem uma cópia de sombra, o evento PostSnapshot não será enviado. Nesse caso, IVssComponent::SetBackupStamp deve ser chamado durante o processamento do evento PrepareForBackup .

Quando um backup incremental ou diferencial estiver sendo executado, o solicitante indicará ao gravador o carimbo de backup do backup anterior que está servindo como base para esse backup. O gravador pode acessar esse carimbo de backup anterior durante o processamento do evento PrepareForBackup ou PostSnapshot, chamando IVssComponent::GetPreviousBackupStamp. O gravador pode usar o carimbo retornado para determinar o que precisa ser feito o backup.

Estratégias de backup

Estratégias de arquivos de backup de arquivos

Muitas vezes, determinados arquivos relatados nos metadados do gravador só precisam ser copiados em backup ao executar determinados tipos de backup. Alguns arquivos só podem ser necessários ao executar um backup completo. Outros arquivos só podem ser necessários ao executar um backup incremental ou diferencial. O VSS fornece um método para os gravadores indicarem essas informações ao solicitante. Ao adicionar arquivos a componentes usando IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles ou IVssCreateWriterMetadata::AddFilesToFileGroup, o parâmetro dwBackupTypeMask indica para quais tipos de backup esses arquivos devem ser copiados em backup. A máscara pode conter um ou mais dos seguintes valores:

VSS_FSBT_FULL_BACKUP_REQUIRED

Necessário para backups completos.

VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED

Necessário para backups diferenciais.

VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED

Necessário para backups incrementais.

VSS_FSBT_LOG_BACKUP_REQUIRED

Necessário para backups de log.

VSS_FSBT_ALL_BACKUP_REQUIRED

Necessário para todos os tipos de backup; esse é o padrão.

Essa especificação substitui a especificação de seletividade do componente. Por exemplo, considere um componente cujos arquivos estão marcados com VSS_FSBT_LOG_BACKUP_REQUIRED mas não com VSS_FSBT_FULL_BACKUP_REQUIRED. Suponha que esse componente não seja selecionável para backup (bSelectable era false quando IVssCreateWriterMetadata::AddComponent foi chamado). No caso de um backup de log, isso significa que todos os arquivos nesse componente sempre devem ser copiados em backup. No entanto, no caso de um backup completo, nenhum dos arquivos precisa ser feito backup, apesar do fato de que a seletividade do componente implica que ele deve ser feito backup.

Backup por hora da última modificação

Uma maneira de um gravador indicar quais arquivos foram alterados é usando o mecanismo de arquivo diferente. Um gravador pode especificar que determinados arquivos em um componente só devem ser copiados em backup se tiverem sido modificados desde um determinado momento. O gravador chama IVssComponent::AddDifferencedFilesByLastModifyTime com uma especificação de arquivo e uma hora de última modificação. IVssComponent::AddDifferencedFilesByLastModifyTime normalmente é chamado durante o processamento do evento PostSnapshot, embora possa ser chamado durante o processamento do evento PrepareForBackup. Em seguida, o solicitante deve fazer backup de todos os arquivos correspondentes à especificação de arquivo que foram alterados desde a hora especificada. Se o gravador estiver usando o mecanismo de carimbo de backup, esse último tempo de modificação será determinado com base no carimbo de backup anterior no documento de backup. O gravador também pode passar zero para o último tempo de modificação, o que indica que o solicitante é responsável por determinar a hora do último backup e os arquivos alterados desde esse tempo.

Backup parcial de arquivos

Outra maneira de um gravador indicar alterações no solicitante é usando o mecanismo de arquivo parcial. Um gravador pode especificar intervalos de bytes dentro de arquivos de componente que precisam ser copiados em backup; o gravador pode especificar esses intervalos de arquivos durante o processamento do evento PostSnapshot ou PrepareForBackup. O gravador chama IVssComponent::AddPartialFile para adicionar especificações parciais de arquivo ao backup. Uma especificação de arquivo parcial consiste em um caminho e um nome de arquivo, juntamente com informações sobre quais intervalos no arquivo precisam ser copiados em backup.

Regras de especificação de arquivo

IVssComponent::AddDifferencedFilesByLastModifyTime ou IVssComponent::AddPartialFile podem ser usados para modificar as especificações de arquivo fornecidas durante o evento Identifique ou para adicionar arquivos completamente novos à especificação. Se o gravador estiver modificando as informações definidas durante o evento Identifique usando IVssComponent::AddDifferencedFilesByLastModifyTime, a especificação do arquivo deverá corresponder exatamente a uma das especificações de arquivo no componente atual. A especificação do arquivo não deve sobrepor parcialmente os arquivos no componente atual e não deve corresponder aos arquivos em nenhum outro componente. Os arquivos especificados usando IVssComponent::AddPartialFile podem, no entanto, sobrepor parcialmente outra especificação de arquivo. As informações definidas por IVssComponent::AddDifferencedFilesByLastModifyTime ou IVssComponent::AddPartialFile substituem as informações definidas anteriormente usando a interface IVssCreateWriterMetadata em resposta ao evento Identify.

As especificações gerais de arquivo podem ter um valor de local alternativo (definido pelo parâmetro wszAlternateLocation de IVssCreateWriterMetadata::AddFilesToFileGroup) que indica um local alternativo para obter o arquivo no momento do backup. Se a especificação de arquivo definida por meio dos mecanismos de arquivo diferenciado ou de arquivo parcial corresponder a uma especificação de arquivo existente que tenha um local alternativo, o aplicativo de backup obterá os dados desse local alternativo.

Se a especificação de arquivo definida em IVssComponent::AddDifferencedFilesByLastModifyTime ou em IVssComponent::AddPartialFile não corresponder e os arquivos no componente que estão sendo copiados em backup, todos os arquivos correspondentes agora serão adicionados ao backup. É necessário ter cuidado para que o gravador adicione apenas arquivos que existem em um volume que já está sendo copiado por sombra ao fazer isso; caso contrário, o solicitante poderá não fazer backup desses arquivos. Se essas funções forem chamadas durante o processamento do evento PostSnapshot, isso poderá ser determinado usando o método CVssWriter::IsPathAffected . Se chamado durante o tratamento do evento PrepareForBackup, o gravador deve fazer essa determinação usando outro método.

Backup sem uma cópia de sombra

Talvez não seja necessário fazer backup de determinados tipos de arquivos de um volume de cópia de sombra. Por exemplo, isso geralmente será verdadeiro para arquivos de log do banco de dados. Como os arquivos de log crescem monotonicamente e um gravador pode especificar exatamente quais partes do arquivo fazer backup usando arquivos parciais, geralmente será possível fazer backup do log do volume original. Como otimização, um gravador pode marcar quais arquivos exigem cópias de sombra para diferentes tipos de backup usando os sinalizadores definidos no parâmetro dwBackupTypeMask de IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles ou IVssCreateWriterMetadata::AddFilesToFileGroup. Os sinalizadores com suporte incluem o seguinte:

VSS_FSBT_FULL_SNAPSHOT_REQUIRED

Cópia de sombra necessária para backups completos.

VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

Cópia de sombra necessária para backups diferenciais.

VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED

Cópia de sombra necessária para backups incrementais.

VSS_FSBT_LOG_SNAPSHOT_REQUIRED

Cópia de sombra necessária para backups de log.

VSS_FSBT_ALL_SNAPSHOT_REQUIRED

Cópia de sombra necessária para todos os tipos de backup; esse é o padrão.

Se um volume específico contiver apenas componentes que não exigem uma cópia de sombra para esse backup, o solicitante poderá ignorar a etapa de criação de uma cópia de sombra para esse volume. Todos os dados nesse volume podem ser copiados para a mídia de backup diretamente do volume original.

Limpeza de Backup

Se o gravador precisar executar o truncamento de log ou outra limpeza pós-backup, o local adequado para fazer isso será durante o processamento do evento BackupComplete . O evento BackupShutdown será enviado algum tempo após BackupComplete, portanto, algumas limpezas também podem ser feitas no manipulador de eventos BackupShutdown.

O evento BackupShutdown sempre é enviado após o encerramento de um backup. Se o solicitante terminar de forma anormal ao executar um backup, BackupShutdown será enviado imediatamente, sem primeiro enviar BackupComplete. Se o gravador precisar limpo qualquer estado, isso pode ser feito aqui; no entanto, o truncamento de log não deve acontecer nesse evento porque o backup não foi necessariamente concluído.

Estratégias de restauração

As tarefas básicas dos gravadores na restauração são verificar se a restauração pode acontecer na manipulação do evento PreRestore e se a restauração ocorreu no tratamento do evento PostRestore. Repositórios mais complexos também executarão um processo de recuperação no manipulador PostRestore. Se a restauração fizer parte de uma restauração incremental ou diferencial, o gravador geralmente desejará atrasar esse processo de recuperação até que todas as restaurações incrementais ou diferenciais tenham sido concluídas. IVssComponent::GetAdditionalRestores indicará se essa é a restauração final desse componente ou se há mais restaurações por vir. Se IVssComponent::GetAdditionalRestores retornar true, o gravador não deverá executar seu procedimento de recuperação nesse componente.

Novos destinos

Se houver suporte do gravador, o solicitante poderá restaurar arquivos de dados em um local diferente do local original do tempo de backup. Um gravador indica suporte para esse modo de restauração definindo o bit VSS_BS_WRITER_SUPPORTS_NEW_TARGET no parâmetro dsSchemaMask ao chamar IVssCreateWriterMetadata::SetBackupSchema. Um gravador obtém os novos locais para arquivos de componente no momento da restauração chamando IVssComponent::GetNewTargetCount e IVssComponent::GetNewTarget.

Destinos Direcionados

Para cenários de restauração complicados, um gravador pode querer mapear intervalos de um arquivo de backup em intervalos diferentes do mesmo arquivo ou de um arquivo diferente. Isso pode ser feito usando o mecanismo de destino direcionado. Para fazer isso, um gravador deve primeiro indicar que isso está acontecendo chamando IVssComponent::SetRestoreTarget, passando VSS_RT_DIRECTEDpara o parâmetro de destino. Em seguida, para cada mapeamento, o gravador chama IVssComponent::AddDirectedTarget. Esse método usa um caminho completo para um arquivo de origem no backup e um caminho completo para um arquivo de destino para o qual será restaurado. Ele também usa uma lista de intervalos para cada um desses arquivos. O gravador chama essas funções ao manipular o evento PreRestore e o solicitante é responsável por restaurar os intervalos especificados no arquivo de origem para os intervalos mapeados no arquivo de destino. O formato da cadeia de caracteres de intervalos é o mesmo que em IVssComponent::AddPartialFile

Metadados do Gravador Privado

Geralmente, é útil para um gravador manter metadados privados com um backup para executar corretamente uma restauração incremental ou diferencial. Um gravador pode chamar IVssComponent::SetBackupMetadata ao manipular PrepareForBackup ou PostSnapshot para armazenar metadados. Esses metadados podem ser acessados pelo gravador durante PreRestore ou PostRestore chamando IVssComponent::GetBackupMetadata. Os metadados também podem ser armazenados com especificação de arquivo parcial usando o parâmetro wszMetadata de IVssComponent::AddPartialFile; esses metadados são acessados por meio do parâmetro pbstrMetadatade IVssComponent::GetPartialFile. O gravador também pode passar metadados para si mesmo entre CVssWriter::OnPreRestore e CVssWriter::OnPostRestore. Em CVssWriter::OnPreRestore, os metadados são definidos chamando IVssComponent::SetRestoreMetadata. Em CVssWriter::OnPostRestore, os metadados são recuperados chamando IVssComponent::GetRestoreMetadata.