Una copia de seguridad completa en SQL Server 2008 no rompe la cadena de registro. Solo restablece el diferencial base-lsn.
También puede restaurar las copias de seguridad del registro después de restaurar solo desde una copia. El siguiente script muestra 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;
Crea una base de datos y una tabla e inserta 50 filas en esa tabla. Entre esos insertos, se realizan varias copias de seguridad en este orden:
- Lleno
- Iniciar sesión
- Lleno
- Copia completa_Solo
- Iniciar sesión
A continuación, la base de datos se descarta y se restaura así:
- 1er lleno
- 1er registro
- 2do registro
Lo siguiente SELECT
demuestra que la restauración fue exitosa.
Esto muestra que ni una COP_ONLY
copia de seguridad completa ni una normal rompen la cadena de registro.
Luego, la base de datos se descarta nuevamente y se restaura así:
- Copy_Only Full
- 2do registro
Luego, el SELECT
éxito demuestra nuevamente.
Esto demuestra que puede utilizar una COPY_ONLY
copia de seguridad completa como base de su Restauración de registro.
Pruebas diferenciales
También creé una DIFFERENTIAL
versión:
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;
Esto toma copias de seguridad en este orden:
- 1er lleno
- 1er diferencial
- 2do completo
- 2do diferencial
- Copy_Only Diff
- 3er diferencial
Luego intenta esta ruta de restauración:
- 1er lleno
- 1er diferencial
- 2do diferencial
El paso 3 falla con este error:
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.
Esto muestra que una copia de seguridad completa normal rompe la cadena diferencial.
A continuación, la base de datos se descarta y se intenta este flujo de restauración:
- Copy_Only Full
- 3er diferencial
El paso 2 falla con el mismo error que el paso 3 anterior. Esto muestra que una copia de seguridad de solo copia no se puede usar como base para una restauración diferencial.
Luego, la base de datos se descarta nuevamente y se ejecuta la siguiente restauración:
- 2do completo
- 2do diferencial
- 3er diferencial
La siguiente selección demuestra que esta restauración se realizó correctamente. Esto muestra que una COPY_ONLY
copia de seguridad completa no interrumpe la cadena diferencial.
Esto es lo que sucede cuando hay diferenciales involucrados:
En una palabra: sí, puede usar una
COPY_ONLY
copia de seguridad para restaurar más copias de seguridad de registros. Lo que no puede hacer es usar laCOPY_ONLY
copia de seguridad como base diferencial. Eso significa que no podrá restaurar ningunaCOPY_ONLY
copia de seguridad diferencial en la copia de seguridad restaurada :Si intenta esto, recibirá un error:
Las copias de seguridad diferenciales pueden ser difíciles de entender y pueden engañar incluso a los DBA experimentados.
fuente