SQL Server 2008 R2 Restaurar copia de seguridad completa COPY_ONLY con registros de transacciones

11

Después de investigar un poco, parece que no puedo encontrar una respuesta a esta pregunta.

Antecedentes Estoy intentando configurar un plan de respaldo que se ajuste a los siguientes tres requisitos:

  1. Fiabilidad de las copias de seguridad, con copias de seguridad completas nocturnas
  2. Copias de seguridad del registro de transacciones que podrían restaurarse desde
  3. Baja cantidad de espacio en disco utilizado
  4. Las copias de seguridad deben ser accesibles localmente para una herramienta de auditoría

Entonces, para satisfacer esas necesidades, estoy pensando en copias de seguridad completas semanales, diferenciales diarias y transacciones por hora. Luego, cada noche se ejecutará una copia de seguridad de copy_only que se puede enviar fuera del sitio, esta copia de seguridad se realiza para que la cadena de registro no se rompa, y tenemos copias de seguridad completas confiables todas las noches fuera del sitio, sin tener que ocupar tanto espacio en el disco local.

Pregunta ¿Es posible restaurar desde la copia de seguridad copy_only y restaurar los registros de transacciones después?

Permítanme dar un ejemplo para que sepan de lo que estoy hablando.

Usando la lista a continuación, me pregunto si es posible restaurar FullbackupCOPY_ONLYC.bak seguido de TransactionbackupG.trn, TransactionbackupH.trn, finalmente TransactionbackupI.trn

> ---List of Backups---   
FullbackupA.bak 01/01/2013 00:00:00   
>  DifferntialbackupA.bak 02/01/2013 00:00:00 
FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00
>     TransactionbackupA.trn 02/01/2013 01:00:00
>     TransactionbackupB.trn 02/01/2013 02:00:00
>     TransactionbackupC.trn 02/01/2013 03:00:00
>  DifferntialbackupB.bak 03/01/2013 00:00:00 
FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00
>     TransactionbackupD.trn 03/01/2013 01:00:00
>     TransactionbackupE.trn 03/01/2013 02:00:00
>     TransactionbackupF.trn 03/01/2013 03:00:00
>  DifferntialbackupC.bak 04/01/2013 00:00:00 
FullbackupCOPY_ONLYC.bak 04/01/2013 00:00:00
>     TransactionbackupG.trn 04/01/2013 01:00:00
>     TransactionbackupH.trn 04/01/2013 02:00:00
>     TransactionbackupI.trn 04/01/2013 03:00:00

Tal vez toda esta configuración no sea razonable. Soy bastante nuevo en SQL Server y estoy tratando de aprender sobre la marcha. Cualquier consejo / ayuda sería apreciado.

dv10t
fuente

Respuestas:

14

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:

  1. Lleno
  2. Iniciar sesión
  3. Lleno
  4. Copia completa_Solo
  5. Iniciar sesión

A continuación, la base de datos se descarta y se restaura así:

  1. 1er lleno
  2. 1er registro
  3. 2do registro

Lo siguiente SELECTdemuestra que la restauración fue exitosa.

Esto muestra que ni una COP_ONLYcopia de seguridad completa ni una normal rompen la cadena de registro.

Luego, la base de datos se descarta nuevamente y se restaura así:

  1. Copy_Only Full
  2. 2do registro

Luego, el SELECTéxito demuestra nuevamente.

Esto demuestra que puede utilizar una COPY_ONLYcopia de seguridad completa como base de su Restauración de registro.

Pruebas diferenciales

También creé una DIFFERENTIALversió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:

  1. 1er lleno
  2. 1er diferencial
  3. 2do completo
  4. 2do diferencial
  5. Copy_Only Diff
  6. 3er diferencial

Luego intenta esta ruta de restauración:

  1. 1er lleno
  2. 1er diferencial
  3. 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:

  1. Copy_Only Full
  2. 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:

  1. 2do completo
  2. 2do diferencial
  3. 3er diferencial

La siguiente selección demuestra que esta restauración se realizó correctamente. Esto muestra que una COPY_ONLYcopia de seguridad completa no interrumpe la cadena diferencial.

Sebastian Meine
fuente
Estaba buscando información sobre si podría aplicar un registro de transacciones a una copia de seguridad completa copy_only. Esta es realmente una buena información!
Brain2000
2

Esto es lo que sucede cuando hay diferenciales involucrados:

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 -- 10 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 20 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 30 rows so far
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 40 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 50 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 60 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 70 rows so far
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_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70: log chain not broken
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 COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70
GO
DROP DATABASE BakTst13;

En una palabra: sí, puede usar una COPY_ONLYcopia de seguridad para restaurar más copias de seguridad de registros. Lo que no puede hacer es usar la COPY_ONLYcopia de seguridad como base diferencial. Eso significa que no podrá restaurar ninguna COPY_ONLYcopia de seguridad diferencial en la copia de seguridad restaurada :

DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;

Si intenta esto, recibirá un error:

Processed 160 pages for database 'BakTst13', file 'BakTst13' on file 1.
Processed 2 pages for database 'BakTst13', file 'BakTst13_log' on file 1.
RESTORE DATABASE successfully processed 162 pages in 0.009 seconds (139.811 MB/sec).
Msg 3136, Level 16, State 1, Line 2
This differential backup cannot be restored because the database has not been restored to the correct earlier state.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

Las copias de seguridad diferenciales pueden ser difíciles de entender y pueden engañar incluso a los DBA experimentados.

spaghettidba
fuente