Um backup completo no SQL Server 2008 não quebra a cadeia de logs. Apenas redefine o diferencial base-lsn.
Você também pode restaurar backups de log após restaurar somente de uma cópia. O script a seguir demonstra que:
CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;
Ele cria um banco de dados e uma tabela e insere 50 linhas nessa tabela. Entre essas inserções, vários backups são feitos nesta ordem:
- Cheio
- Registro
- Cheio
- Copy_Only completo
- Registro
Em seguida, o banco de dados é descartado e restaurado da seguinte maneira:
- 1st Full
- 1st Log
- 2nd Log
A seguir, SELECT
demonstramos que a restauração foi bem-sucedida.
Isso mostra que nem um COP_ONLY
backup completo normal nem interrompe a cadeia de logs.
Em seguida, o banco de dados é descartado novamente e restaurado da seguinte maneira:
- Copy_Only Full
- 2nd Log
Posteriormente, o SELECT
sucesso é demonstrado novamente.
Isso demonstra que você pode usar um COPY_ONLY
backup completo como base da sua restauração de log.
Testes diferenciais
Também criei uma DIFFERENTIAL
versão:
CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Diff_1' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Diff_2' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13
TO DISK = 'BakTst13_Diff_3' WITH DIFFERENTIAL,INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F1, D1, D2',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_1' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore FC, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F2, D2, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;
Isso faz backups nesta ordem:
- 1st Full
- 1º Diferencial
- 2nd Full
- 2º Diferencial
- Copy_Only Diff
- 3º Diferencial
Em seguida, tenta esta rota de restauração:
- 1st Full
- 1º Diferencial
- 2º Diferencial
Etapa 3 falha com este erro:
Msg 3136, Level 16, State 1, Line 4
This differential backup cannot be restored because the database has not been restored to the correct earlier state.
Isso mostra que um backup completo normal interrompe a cadeia diferencial.
Em seguida, o banco de dados é descartado e esse fluxo de restauração é tentado:
- Copy_Only Full
- 3º Diferencial
A etapa 2 falha com o mesmo erro da etapa 3 acima. Isso mostra que um backup apenas de cópia não pode ser usado como base para uma restauração diferencial.
Em seguida, o banco de dados é descartado novamente e a seguinte restauração é executada:
- 2nd Full
- 2º Diferencial
- 3º Diferencial
A seleção a seguir prova que essa restauração foi bem-sucedida. Isso mostra que um COPY_ONLY
backup completo não interrompe a cadeia diferencial.
Aqui está o que acontece quando os diferenciais estão envolvidos:
Em uma palavra: sim, você pode usar um
COPY_ONLY
backup para restaurar mais backups de log. O que você não pode fazer é usar oCOPY_ONLY
backup como uma base diferencial. Isso significa que você não poderá restaurar nenhum backup diferencial noCOPY_ONLY
backup restaurado :Se você tentar isso, você receberá um erro:
Os backups diferenciais podem ser difíceis de entender e podem enganar até os DBAs experientes.
fonte