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

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

Tipo 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 data do último 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.

    A restauração de 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 de backup intermediário 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 somente 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 copiados em 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 data do último 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, em caso afirmativo, indica isso definindo as informações em IVssBackupComponents::SetBackupState.

O solicitante especifica que tipo de backup está sendo executado por meio do parâmetro backupType de IVssBackupComponents::SetBackupState. Gravadores diferentes darão suporte a diferentes tipos de backup. Depois que IVssBackupComponents::GatherWriterMetadata tiver sido chamado, o solicitante poderá determinar quais tipos de backup um determinado gravador dá suporte chamando IVssExamineWriterMetadata::GetBackupSchema. O valor retornado é uma máscara de bits que indica suporte para diferentes tipos de backup. VSS_BS_DIFFERENTIAL indica suporte para backups diferenciais, VSS_BS_INCREMENTAL para backups incrementais, VSS_BS_LOG para backups de log e VSS_BS_COPY para backups de cópia; todos os gravadores devem dar suporte a backups completos. Se um gravador não der suporte à combinação de backups incrementais com backups diferenciais, o sinalizador VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL também será adicionado. Se o solicitante estiver executando um backup incremental ou diferencial e um determinado gravador não der suporte a esse tipo de backup, um backup completo deverá ser executado nesse gravador.

Carimbos de Backup

Os 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 controlar a posição do log, as informações de ponto de verificação e assim por diante. O solicitante pode determinar se um determinado gravador precisa armazenar seu próprio carimbo de data/hora verificando a VSS_BS_TIMESTAMPED bit no valor retornado por IVssExamineWriterMetadata::GetBackupSchema.

Os gravadores que armazenam um carimbo de data/hora em um backup adicionarão o carimbo de data/hora durante o processamento de IVssBackupComponents::P repareForBackup ou durante o processamento de IVssBackupComponents::D oSnapshotSet. O solicitante pode obter esse carimbo de data/hora chamando IVssComponent::GetBackupStamp. Ao executar um backup incremental ou diferencial, o solicitante precisa vincular o backup atual a algum backup anterior. Isso é feito obtendo o carimbo de data/hora do backup anterior de um componente específico e passando-o para a função IVssBackupComponents::SetPreviousBackupStamp ; isso precisa ser feito para cada componente que foi copiado em backup no backup anterior.

Fazendo backup de arquivos

Fazendo backup de arquivos relatados pelo gravador

Cada especificação de arquivo que um gravador adiciona aos metadados durante a fase GatherWriterMetadata contém uma máscara de tipo de backup que especifica quando o arquivo deve ser copiado em backup. O solicitante determina qual é essa máscara chamando IVssWMFiledesc::GetBackupTypeMask. Os valores nessa máscara são usados para determinar para quais tipos de backup a especificação de arquivo precisa ser copiada em backup. A máscara pode conter um ou mais dos seguintes valores de bit:

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 todos 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 copiado em backup, apesar do fato de que a seletividade do componente implica que ele deve ser copiado em backup.

Backup por Hora da Última Modificação

As informações de especificação de arquivo especificadas na fase IVssBackupComponents::GatherWriterMetadata não fornecem ao solicitante informações sobre o que mudou desde o último backup. Uma maneira de um gravador indicar alterações no solicitante é usando o mecanismo de arquivo diferenciado. Um gravador pode especificar que determinados arquivos em um componente devem ser copiados em backup somente se tiverem sido modificados desde um determinado momento; O gravador pode especificar esses arquivos em IVssBackupComponents::P repareForBackup ou em IVssBackupComponents::D oSnapshotSet. Um solicitante pode determinar esses arquivos chamando IVssComponent::GetDifferencedFilesCount e IVssComponent::GetDifferencedFile. Se a especificação do arquivo corresponder a um conjunto em IVssBackupComponents::GatherWriterMetadata (que atualmente é válido com base na máscara de tipo de backup), as informações de arquivo diferentes substituirão as informações anteriores; ou seja, os arquivos que correspondem a essa especificação de arquivo serão copiados em backup somente se tiverem sido modificados desde a hora especificada. A hora da última modificação é comunicada usando uma estrutura FILETIME . Se o valor dessa estrutura for zero, isso implica que a hora da última modificação deve ser determinada com base no registro do solicitante da hora do último backup.

Backup parcial de arquivo

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 em IVssBackupComponents::P repareForBackup ou em IVssBackupComponents::D oSnapshotSet. Um solicitante pode determinar esses arquivos chamando IVssComponent::GetPartialFileCount e IVssComponent::GetPartialFile. IVssComponent::GetPartialFile retornará um caminho e um nome de arquivo apontando para o arquivo e uma cadeia de caracteres de intervalos indicando o que precisa ser feito no backup no arquivo. Assim como acontece com arquivos diferenciados, se o caminho e o nome do arquivo corresponderem a uma especificação de arquivo definida pelo gravador em IVssBackupComponents::GatherWriterMetadata, as informações de arquivo parcial substituirão a configuração anterior. A cadeia de caracteres de intervalos pode ter dois formatos: ela pode especificar os intervalos diretamente ou pode especificar um arquivo que contém informações de intervalos. Se especificar intervalos diretamente, a sintaxe será uma lista separada por vírgulas do formulário offset1:length1, offset2:length2, em que cada deslocamento e comprimento é um inteiro sem sinal de 64 bits. Se estiver especificando um arquivo de intervalos, a cadeia de caracteres de intervalos deverá ser definida como File= filename, em que filename é o caminho completo para o arquivo de intervalos. O próprio arquivo de intervalos é um arquivo binário formatado como uma lista de inteiros sem sinal de 64 bits. O primeiro inteiro indica quantos intervalos são representados no arquivo. Cada par subsequente de inteiros representa o deslocamento e o comprimento de um intervalo. O solicitante deve ter cuidado para fazer backup e restaurar esse arquivo de intervalos também.

Regras de especificação de arquivo

As especificações de arquivo adicionadas por meio do arquivo diferenciado e dos mecanismos de arquivo parcial modificarão as especificações de arquivo definidas em IVssBackupComponents::GatherWriterMetadata ou adicionarão arquivos completamente novos. Se estiver modificando as especificações de arquivos definidas em IVssBackupComponents::GatherWriterMetadata usando o mecanismo de arquivo parcial, um solicitante poderá esperar que a especificação do arquivo corresponda exatamente a uma das especificações de arquivo definidas no componente em IVssBackupComponents::GatherWriterMetadata. A especificação do arquivo não se sobrepõe parcialmente a outra especificação de arquivo e não corresponderá a nenhuma especificação de arquivo em nenhum outro componente desse gravador. As especificações de arquivo adicionadas usando o mecanismo de arquivo parcial podem, no entanto, sobrepor parcialmente outra especificação de arquivo. Quando isso é verdadeiro, a especificação de arquivo diferenciado ou de arquivo parcial substitui o conjunto de especificações em IVssBackupComponents::GatherWriterMetadata. As especificações gerais de arquivo podem ter um valor de local alternativo (retornado por IVssWMFiledesc::GetAlternateLocation) que indica um local alternativo para obter o arquivo no momento do backup. Se as especificações de arquivo definidas por meio dos mecanismos de arquivo parciais ou arquivo diferenciados corresponderem a uma especificação de arquivos existente que tenha um local alternativo, os dados deverão ser coletados nesse local alternativo. Se as especificações de arquivo definidas por meio dos mecanismos de arquivo diferenciado ou de arquivo parcial não corresponderem a nenhuma especificação existente para o componente, esses intervalos de arquivos agora deverão ser adicionados ao backup. O solicitante pode esperar que somente arquivos em volumes que já foram incluídos no conjunto de cópias de sombra sejam adicionados usando um desses mecanismos.

Backup sem uma cópia de sombra

Alguns tipos de arquivos podem não precisar ser copiados em backup de um volume de cópia de sombra. Por exemplo, isso geralmente será verdadeiro para arquivos de log de 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 a máscara de tipo de backup. O valor retornado de IVssWMFiledesc::GetBackupTypeMask pode conter um ou mais dos seguintes valores de bit:

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.

Restaurando arquivos

Restaurações sequenciais

Depois que o solicitante terminar de executar uma operação de restauração, ele enviará o evento PostRestore para todos os gravadores. Geralmente, os gravadores lidam com esse evento executando a recuperação ou outras operações pós-restauração. A restauração de backups incrementais, no entanto, geralmente ocorre como uma sequência de operações de restauração, uma por backup incremental. O solicitante precisa informar ao gravador que essa restauração está em andamento para impedir que a recuperação ou outras operações indesejáveis ocorram até que a restauração seja completamente concluída. Isso é feito chamando IVssBackupComponents::SetAdditionalRestores. Esse método é chamado por componente e indica ao gravador que mais restaurações estão chegando para esse componente. Para a restauração final na sequência, o sinalizador de restaurações adicionais deve ser definido como false (seu valor padrão), o que indica que esta é a última restauração na sequência desse componente.

Novos destinos

Se houver suporte do gravador, o solicitante poderá restaurar arquivos de dados para um local diferente do local de tempo de backup original. O solicitante pode marcar para esse suporte chamando IVssExamineWriterMetadata::GetBackupSchema. O bit VSS_BS_WRITER_SUPPORTS_NEW_TARGET será definido se o gravador der suporte a esse comportamento. O solicitante informa o gravador do novo local chamando IVssBackupComponents::AddNewTarget para cada especificação de arquivo realocado. O solicitante também pode decidir restaurar um arquivo de intervalos específico para um local diferente. O solicitante informa o gravador dessa alteração chamando IVssBackupComponents::SetRangesFilePath.

Destinos Direcionados

Para cenários de restauração complicados, um gravador pode querer mapear intervalos de um arquivo de backup para diferentes intervalos do mesmo arquivo ou de outro. Isso pode ser feito usando o mecanismo de destino direcionado. O solicitante pode determinar após a fase IVssBackupComponents::P reRestore que esse mecanismo está sendo usado para um componente chamando IVssComponent::GetRestoreTarget e verificando se há um retorno de VSS_RT_DIRECTED. O solicitante pode obter todas essas restaurações redirecionadas chamando IVssComponent::GetDirectedTargetCount e IVssComponent::GetDirectedTarget. IVssComponent::GetDirectedTarget retornará um caminho completo para um arquivo de origem no backup e um caminho completo para um arquivo de destino no qual será restaurado. Ele também retorna uma lista de intervalos para cada um desses arquivos. Em seguida, 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::GetPartialFile.