Backup FULL reinicia sequência do LOG. Mito?

Olá,

No mês de Abril fiz o curso de SQL Server Internals com o Luciano Moreira, mais conhecido na comunidade como Luti; não vou me estender muito neste assunto, mas se você é um DBA SQL Server, recomendo fortemente que faça este curso. Excelente…

Mas vamos ao foco do nosso post. Durante o curso de internals alguns mitos foram por água abaixo; um deles foi  “Ao realizar um backup full, perdemos a sequência do log”.

Verdade? Sim ou Não?

Bom, confesso que eu sempre tive isso como verdade absoluta e tenho certeza que outros inúmeros DBAs SQL Server pensam o mesmo; mas a verdade é que não, realizar um backup full não quebra a sequência do seu log. Mas falando assim não tem graça né, vamos testar a brincadeira:

Primeiro criamos um banco para nosso teste (no fim do post está o script completo do nosso teste):

CREATE DATABASE testeBackup

Por padrão o SQL Server criar o banco com o recovery model FULL (exceto na edição Express). Isto é importante para o nosso teste já que iremos realizar backup do log. Para confirmar:

-- Recovery Model = FULL
SELECT recovery_model_desc
FROM sys.databases
WHERE NAME LIKE 'testeBackup'

Vamos criar uma tabela para nossos testes e realizar nosso primeiro backup FULL:

USE testeBackup

-- Cria tabela
CREATE TABLE registroBackup
	(id INT IDENTITY,
	registro VARCHAR(50))

-- Realiza backup FULL
BACKUP DATABASE testeBackup
TO DISK = 'C:testeBackupFULL.bak' WITH INIT

Agora utilizando uma estrutura de repetição inserimos 1 registro na tabela e realizamos um backup de log. Isso repetirá por 5 vezes:

DECLARE @i INT

SET @i = 1

WHILE @i <= 5
BEGIN
	-- Insere registro
	INSERT INTO registroBackup
	VALUES ('Antes do '+CAST(@i AS VARCHAR(2))+'º backup de LOG')
	-- Realiza backup de log
	BACKUP LOG testeBackup
	TO DISK = 'C:testeBackupLOG.bak'
	WITH NOINIT
	-- Incrementa contador
	SET @i = @i + 1
END

Verificamos então os registros inseridos na tabela:

SELECT * FROM registroBackup

Resultado:

E verificamos os nossos backups de log:

RESTORE HEADERONLY FROM DISK = 'C:testeBackupLOG.bak'

Resultado:

Como verificamos temos aí 5 registros e 5 backups de log.

Agora realizamos um novo backup FULL:

BACKUP DATABASE testeBackup
TO DISK = 'C:testeBackupFULL_2.bak' WITH INIT

E repetimos a execução do laço:

DECLARE @i INT

SET @i = 6

WHILE @i <= 10
BEGIN
	-- Insere registro
	INSERT INTO registroBackup
	VALUES ('Antes do '+CAST(@i AS VARCHAR(2))+'º backup de LOG')

-- Realiza backup de log
	BACKUP LOG testeBackup
	TO DISK = 'C:testeBackupLOG.bak'
	WITH NOINIT

-- Incrementa contador
	SET @i = @i + 1
END

Ao fim temos 10 registros em nossa tabela, 10 backups de LOG e 2 backups FULL.

Agora entra a figura do estagiário que exclui o segundo arquivo de backup FULL… (sacanagem, rss)

Segundo a lenda, isso inválida todos os backups de log posteriores e teríamos que realizar um backup FULL imediatamente, porque ao realizar o segundo backup FULL perderíamos a seqüência do log.  Certo? Bom… vamos testar:

Excluímos  a base de dados:

USE MASTER
GO
DROP DATABASE testeBackup

E restauramos os backups (FULL + LOGs) ignorando o segundo backup FULL:

RESTORE DATABASE testeBackup
FROM DISK = 'C:testeBackupFULL.bak' -- primeiro backup FULL
WITH NORECOVERY

-- Restauramos os 10 arquivos de log

DECLARE @i INT
SET @i = 1

WHILE @i <= 10
BEGIN

	RESTORE LOG testeBackup
	FROM DISK = 'C:testeBackupLOG.bak'
	WITH FILE = @i, NORECOVERY

	SET @i = @i + 1

END

	RESTORE DATABASE testeBackup
	WITH RECOVERY -- colocamos a base em operação

Verifique que restauramos os 10 registros de nossa tabela:

USE testeBackup
SELECT COUNT(*) FROM registroBackup

Resultado:

Enfim, note que a realização do 2º backup FULL não quebrou a seqüência dos nossos backups de log!

Agora a pergunta que não quer calar: qual a função do parâmetro de backup COPY_ONLY lançado a partir do SQL Server 2005?!

Um backup diferencial tem total dependência do último backup FULL; logo, se você perder o backup FULL anterior, não será possível restaurar o diferencial, mesmo com um FULL mais antigo. Então pense numa situação que você precise de um backup FULL adicional, mas não deseja que ele afete seus próximos backups diferenciais (que deverão continuar utilizando como referência o backup FULL anterior), então aqui utilizaríamos o COPY_ONLY.

Resumindo: Os backups diferenciais posteriores iram ignorar um backup FULL com COPY_ONLY.

CONCLUSÃO

Backup FULL não altera a sequência dos backups de LOG. Se você perdeu seu último backup FULL, mas tem um do mês passado e de lá pra cá todos os seus backups de LOG estão intactos, não se desespere! Você conseguirá restaurar seu backup.

PS: Obrigado Luti pela super dica :D

Disponibilizei o script completo deste teste aqui.

Até +

Read More