Por que um backup diferencial não pode especificar sua base?

18

Este é o meu primeiro post no DBA.SE, por favor, informe-me de quaisquer erros, obrigado!

Eu sou um novo DBA (não um profissional de TI, apenas mais ninguém na empresa para fazê-lo); portanto, quanto mais básica a explicação, melhor. Eu tenho lido sobre estratégias de backup de banco de dados (ou, como aprendi a chamá-las, "estratégias de restauração"). Entendo o que os backups completos, diferenciais e do log de transações fazem, mas quero saber por que um backup diferencial pode ser baseado apenas no backup completo mais recente.

Se um backup diferencial é tudo o que mudou desde o último backup completo, por que o diferencial não pode se basear em nenhum backup de minha escolha? Para ser mais claro, estou perguntando sobre a especificação da base quando o backup é feito , e não durante a restauração. Estou assumindo que, ao restaurar, você escolheria a base correta e o diferencial correspondente para executar a restauração (não usando um diferencial feito da base B para restaurar da base A).

Qual é o motivo que impede que essa funcionalidade seja possível? Eu acho que deve haver uma razão, eu simplesmente não sei o que é.

Nota: Entendo que a base não pode ser especificada, mas minha pergunta é por que não ? (Também não estou interessado na discussão sobre "por que você faria isso?")

Analogia

Aqui está uma analogia de como eu entendo um backup diferencial:

Eu tenho um arquivo do Excel com alguns dados nas células.

No primeiro dia, eu faço uma cópia desse arquivo e o armazeno em outro lugar (o "backup completo").

No dia 2, olho para o arquivo e o comparo com a cópia de backup que fiz no dia 1 e observo todas as células que foram alteradas e quais são seus novos valores (um "backup diferencial"). Não estou anotando todas as alterações feitas em uma célula, apenas qual é o seu valor final. Se a célula A1 começou como "Alfred", mudou para "Betty", "Charlie" e depois "Dave", eu apenas notaria que "A1 agora é Dave".

No dia 3, comparo o arquivo atual com o arquivo de backup novamente e observo as alterações (outro "backup diferencial" com a mesma base do dia 2). Novamente, apenas observando os valores finais por célula no momento observado, nem todos os valores que a célula esteve ao longo do dia.

No dia 4, comparo novamente e observo as alterações novamente. Continuando com a célula A1, agora diz "Sarah", mesmo que tenham sido outros 10 nomes ao longo do dia, e tudo o que observo é "Agora A1 é Sarah".

No dia 5, meu arquivo fica bagunçado; então, olho para a cópia de backup que fiz no dia 1, depois para os estados finais anotados no dia 4 e aplico as alterações observadas na cópia de backup e agora tenho o arquivo "restaurado" como estava no dia 4 Então, eu olho para o backup feito no dia 1, vejo que no dia 4 a célula A1 terminou como "Sarah" e altero a célula de backup A1 para "Sarah".

Por que importaria se eu tivesse feito outra cópia de backup ("cheia") do arquivo no dia 2? Por que ainda não seria possível comparar (ler, "fazer um backup diferencial de") o arquivo no dia 3 ou 4 com a cópia feita no dia 1? Pelo que entendi, o SQL Server exigiria que eu comparasse (ao fazer outro backup diferencial) com um backup completo feito no dia 2 (se um tivesse sido feito) - nenhuma outra opção.

elmer007
fonte

Respostas:

14

Um backup diferencial usa o que é chamado de mapa de alterações diferenciais para criar uma lista de páginas que foram modificadas desde o último backup completo. Essa lista é uma lista "diferencial", daí o nome do tipo de backup e o motivo pelo qual o backup só pode ser restaurado por cima do backup completo associado.

A realização de um backup completo redefine o mapa de alterações diferenciais. A partir desse ponto, qualquer página modificada é registrada no mapa. Se você fizer um diferencial, esse backup conterá apenas páginas que foram modificadas desde o último backup completo e registradas no mapa.

Na sua analogia, os dois backups completos, que servem de base para todo o processo de restauração, provavelmente terão conteúdos diferentes e, portanto, mapas diferenciais diferentes. Se você restaurar um diff com base no primeiro backup no segundo backup, o banco de dados provavelmente estará corrompido. De fato, o SQL Server impede a restauração de um backup diferencial sobre qualquer coisa, exceto o backup completo original em que se baseia.

Quando você solicita ao SQL Server que faça um backup diferencial, a única "base" para o diferencial é o único mapa de alterações diferenciais presente no banco de dados no momento em que o backup diferencial é iniciado. É por isso que você não pode especificar a base para o backup diferencial.


Em resposta a um comentário do @MartinSmith - você poderá usar os COPY_ONLYbackups para restaurar um backup diferencial em vários backups completos. Considere o seguinte cenário:

  1. BACKUP DATABASE xyz TO DISK = 'path_to_backup.bak';
  2. BACKUP DATABASE xyz TO DISK = 'path_to_backup_2.bak' WITH COPY_ONLY;
  3. BACKUP DATABASE xyz TO DISK = 'path_to_backup_3.bak' WITH COPY_ONLY;
  4. BACKUP DATABASE xyz TO DISK = 'path_to_backup_4.bak' WITH COPY_ONLY;
  5. BACKUP DATABASE xyz TO DISK = 'path_to_backup_diff.bak' WITH DIFFERENTIAL;

O backup diferencial na etapa 5 deve poder ser restaurado sobre qualquer um dos backups executados nas etapas 1 a 4, pois o mapa de alterações diferenciais só é limpo quando ocorre o backup completo na etapa 1. Os COPY_ONLYbackups nas etapas 2, 3 e 4, não redefinem o mapa de alterações. Como o mapa de alterações diferenciais acumula alterações feitas desde o backup completo, cada um dos COPY_ONLYbackups sucessivos contém informações suficientes para que o backup diferencial funcione com qualquer um dos 4 backups anteriores.

Embora pareça que deveria funcionar, na prática, restaurar um diferencial por cima de um backup copy_only resulta no seguinte erro:

Mensagem 3136, Nível 16, Estado 1, Linha 1
Esse backup diferencial não pode ser restaurado porque o banco de dados não foi restaurado no estado anterior correto.
A mensagem 3013, nível 16, estado 1, linha 1
RESTORE DATABASE está sendo finalizada de maneira anormal.

Criei uma plataforma de reprodução do SQL Server 2012 para testar restaurações diferenciais e copy_only e salvei o arquivo em gist.github.com - AVISO: o script descartará qualquer banco de dados nomeado RestoreTestcomo sua primeira etapa.

Max Vernon
fonte
A execução de um backup completo somente redefine o mapa de alterações diferenciais, caso não seja COPY_ONLY- Se o OP fizesse um backup completo regular no dia 1 e um COPY_ONLYbackup completo no dia 2, que problemas seriam causados ​​pela aplicação de um diferencial posterior nessa mesma base para o dia 2 de backup?
Martin Smith
Acabei de testá-lo e, na prática, ele não permite restaurar o diferencial posterior em um copy_only, embora "Este backup diferencial não possa ser restaurado porque o banco de dados não foi restaurado no estado anterior correto". - Não tenho certeza se há algum motivo para que isso não funcione ou apenas não é implementado.
Martin Smith
11
@MartinSmith - shooot. Eu já validei isso agora.
Max Vernon
5

O recurso que você deseja pode existir em princípio. Não seria eficiente com as estruturas atuais do banco de dados (veja a resposta de Max Vernon). O SQL Server precisaria manter um conjunto de mapas de diferenças ou comparar o conteúdo atual do banco de dados com o backup completo especificado como base.

Existem aplicativos que desduplicam arquivos grandes. Você pode fazer dois backups completos e apenas os dados alterados serão realmente armazenados. É como um diff com base personalizada. exdupepor exemplo, pode fazer isso.

O bom disso é que ele funciona com qualquer conjunto de arquivos de backup. De fato, começando com o terceiro arquivo de backup completo, você pagará apenas o uso de espaço incremental (e não diferencial). O uso do espaço é a diferença para o arquivo de backup anterior (não para o primeiro). O armazenamento com redução de redundância tem um comportamento semelhante.

Por que o recurso que você descreve não existe? Cada recurso consome orçamento, fazendo com que outros recursos não estejam presentes. Este aparentemente não chegou suficientemente longe na lista de prioridades. Não tenho certeza para o que seria bom. Parece um requisito bastante esotérico para usar bases personalizadas.

usr
fonte
3

Não confunda backups de log de transações com backups diferenciais, pois eles têm finalidades diferentes! O que você está chamando de "backup diferencial", no qual você "observa todas as alterações nas células", é de fato um log de transações .

O objetivo de um backup diferencial é manter pequeno o tamanho do arquivo de backup resultante, registrando apenas as informações que foram alteradas desde o último backup completo e manter o tempo de restauração dentro do seu objetivo de tempo de recuperação (RTO).

A finalidade de um backup do log de transações é para deixá-lo repetir as transações a um ponto arbitrário no tempo - muitas vezes, mas definitivamente não necessariamente "a recente mais nada para acontecer".

O que você está falando é de fato possível - mas você precisa restaurar o backup completo e, em seguida, restaurar os logs de transações.

Se você tiver o backup completo do dia 1 e todos os backups do log de transações entre o dia 1 e o dia 5, não haverá nada para impedir a restauração do backup do dia 1 e a reprodução do log de transações até que você tenha os dados como no dia 4. Você também pode começar a partir do backup do dia 2, que seria um pouco mais rápido de restaurar, pois você repetiria menos transações. Você também pode restaurar o backup completo do dia 1, o backup diferencial do dia 3 e, em seguida, restaurar os logs de transações para o dia 4.

Editar: OK, sua analogia editada faz um pouco mais de sentido. A resposta é "porque você já pode conseguir o que deseja com os backups do log de transações". Um backup diferencial é apenas uma maneira barata e conveniente de registrar um monte de atividades no log de transações. Ele não oferece nenhuma granularidade de recuperação de dados que um backup de log de transações não oferece. Existem tantos recursos que oferecem "mera conveniência" que o transformam em um produto.

dpw
fonte
Eu acho que pode ter formulado a analogia mal, espera para uma edição ... desculpe
elmer007
Editado para sua nova analogia.
dpw
1

Fazer uma analogia com o Excel é comparar maçãs e laranjas. Por quê ? O Excel não é um banco de dados, pois não possui integridade dos dados. O Excel é um ótimo aplicativo de planilha e pode ser um complemento para o banco de dados.

O SQL Server é um sistema de banco de dados relacional que permite armazenar todos os seus dados e fornece um mecanismo para consultá-los. A parte importante é "Relacional", pois a relação de dados é importante junto com a integridade dos dados (propriedades ACID).

Fundamentos :

Os dados no banco de dados são organizados em componentes lógicos (tabelas, visualizações, procs, gatilhos, etc.) visíveis ao usuário. No mínimo, um banco de dados também é fisicamente implementado como dois (arquivo de dados e log) ou mais (arquivo de dados secundário) no disco.

  • Um banco de dados contém uma página que é a unidade fundamental de armazenamento de dados usada para armazenar registros .
  • Uma página de banco de dados é um pedaço de 8192 bytes (8 KB) de um arquivo de dados do banco de dados.
  • 8 páginas fisicamente contíguas (8 * 8 KB = 64 KB) em um arquivo de banco de dados formam uma extensão .
  • Uma página IAM (Mapa de Alocação de Índice) rastreia aproximadamente 4 GB de espaço em um único arquivo, alinhado em um limite de 4 GB. Esses blocos de 4 GB são chamados de intervalos GAM .

por que um backup diferencial pode se basear apenas no backup completo mais recente. - ou - Se um backup diferencial é tudo o que mudou desde o último backup completo, por que o diferencial não pode ser baseado em nenhum backup de minha escolha?

Com base na sua analogia com o Excel, o que você está fazendo é aplicar o que mudou no primeiro. Isso está aplicando todas as transações confirmadas no log de transações with STOP AT(nota: no dia 5, o arquivo fica bagunçado e você está parando no dia 4)

Em cada seção de 4 GB (chamada intervalo GAM) de cada arquivo de dados, há uma página de banco de dados especial chamada de bitmap diferencial que rastreia quais partes (chamadas extensões) dessa seção de 4 GB foram alteradas desde o último backup completo, indicando dados que foram alterados ou foi adicionado ao banco de dados.

Um backup diferencial verifica esses bitmaps e faz backup apenas das extensões do arquivo de dados marcadas como alteradas. Os bitmaps são redefinidos pelo próximo backup completo (portanto, um backup diferencial pode ser baseado apenas no backup completo mais recente) , para que você possa ver que, à medida que mais e mais alterações no banco de dados são alteradas, mais delas serão marcadas nos bitmaps diferenciais e backups diferenciais sucessivos serão cada vez maiores.

Você pode usar esse script para descobrir quanto do banco de dados mudou desde o último backup completo? .

As informações básicas diferenciais são armazenadas no masterbanco de dados - sys.database_fileou ( sys.master_files- útil quando o banco de dados é somente leitura ou offline).

Existem três colunas importantes que armazenam informações relacionadas à base diferencial .

  • A differential_base_lsné a base para backups diferenciais. As extensões de dados que são alteradas depois differential_base_lsnserão incluídas no backup diferencial.
  • O differential_base_guidé o identificador exclusivo do backup base no qual um backup diferencial se baseia.
  • O differential_base_timeé o tempo que corresponde adifferential_base_lsn

Um backup diferencial é útil para acelerar o RTO (objetivo do tempo de recuperação = tempo necessário para recuperar seu banco de dados), em oposição aos backups completos mais frequentes, que serão um problema para bancos de dados grandes ou para restaurar o volume de backups de log de transações, pois eles podem aumentar ao longo do tempo.

Nota: Um backup completo de COPY_ONLY não redefine a base diferencial, portanto, um backup de COPY_ONLY não pode servir como base diferencial.

Referências :

Kin Shah
fonte
2
@PaulSRandal escreveu As páginas existem para armazenar registros. no blog dele, então eu o referenciei como está. Tendo em referência lógica o que você está dizendo (com base na referência) também é verdade!
Kin Shah