Problema de backup diferencial - por quê? Isso é possível?

13

Estou usando o SQL Server 2014 e esta é a situação:

  • Eu tenho o servidor A e o servidor B.
  • O ETL durante a noite é processado no servidor A.
  • Após a conclusão do processo de carregamento, o backup do banco de dados X (com CHECKSUMe RESTORE VERIFYONLYpara garantir a confiabilidade) é enviado ao servidor B.
  • O servidor B recebe o bakarquivo e restaura o banco de dados lá.

Quero usar a estratégia de backup diferencial para que:

  1. O backup completo é feito apenas no sábado,
    ou seja, o backup completo no servidor A no sábado -> enviar para o servidor B -> restaurar o backup completo no servidor B

  2. O restante dos dias será de backup diferencial,
    ou seja, backup diferencial no servidor A -> enviar para o servidor B -> restaurar o backup diferencial no servidor B

Eu tentei, mas recebi um erro, dizendo:

o log ou o backup diferencial não pode ser restaurado porque nenhum arquivo está pronto para avançar.

Não sei por que. Eu verifiquei sys.database_filesno servidor A e no servidor B e posso ver que differential_Base_LSNe differential_base_GUIDsão iguais. Em qualquer lugar / mais alguma coisa para verificar?

A propósito, na etapa 2 acima, quando estou restaurando o backup diferencial no servidor B, sempre preciso restaurar o backup completo + o backup diferencial de cada vez?

Eu restaurei apenas o backup diferencial WITH RECOVERY(e recebi a mensagem de erro) porque o backup completo já havia sido restaurado no dia anterior.

Para esclarecer: Sim, quero que o db no servidor B seja legível entre os diferenciais. Como posso contornar isso? É minha única opção para RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)seqüência de combo a cada noite?

Qualquer orientação será muito apreciada.

Eu não sei de nada
fonte

Respostas:

15

Você não precisa mexer RECOVERYe NORECOVERY, aqui, tudo que você precisa é a STANDBYopção. Aqui está uma demonstração rápida de como usá-lo.

Crie um banco de dados, configure-o para recuperação simples e crie uma tabela.

Inserir dados, faça algumas diferenças.

Divertido, certo?

USE master;

/*Create a dummy database*/
CREATE DATABASE DiffRestoreTest

/*We simple now*/
ALTER DATABASE DiffRestoreTest SET RECOVERY SIMPLE

/*Context is everything*/
USE DiffRestoreTest

/*If nothing changes, do we even need a diff backup?*/
CREATE TABLE dbo.t1 (Id INT)

/*Take a full backup, dummy*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_FULL.bak' 
WITH INIT, FORMAT, COMPRESSION

/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )

/*Take a differential backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest  
TO DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

Sim, eu menti. Essa é a parte chata.

Você pode restaurar seu backup completo em STANDBY:

/*Exit stage left*/
USE master

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Você pode restaurar os Diffs em ordem com STANDBY:

/*Square one*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 2*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 3*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

E, ao contrário desses arquivos de log irritantes, você pode avançar ao restaurar o Diffs também:

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*What happens if I try to jump the restores?*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Se você quiser testar a legibilidade, basta executar isso entre os comandos de restauração. Você deve ver os IDs aumentarem com cada um. Caso contrário, você fez algo terrivelmente errado.

Lembre-se de que quando você restaura arquivos, ele expulsa todos os usuários finais do banco de dados e não espera que as consultas sejam concluídas.

Isso também deixa o banco de dados em um estado somente leitura, nenhuma alteração pode ser feita aqui.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

E, finalmente, limpe-se.

/*Bring'er online, lad*/
RESTORE DATABASE DiffRestoreTest WITH RECOVERY

DROP DATABASE DiffRestoreTest

Espero que isto ajude!!

Erik Darling
fonte