Problema de copia de seguridad diferencial: ¿por qué? ¿Es posible?

13

Estoy usando SQL Server 2014 y esta es la situación:

  • Tengo el servidor A y el servidor B.
  • Durante la noche ETL se procesa en el servidor A.
  • Una vez que se completa el proceso de carga, se realiza una copia de seguridad de la base de datos X (con CHECKSUMy RESTORE VERIFYONLYpara garantizar la confiabilidad) y luego se envía al servidor B.
  • El servidor B recibe el bakarchivo y luego restaura la base de datos allí.

Quiero usar una estrategia de respaldo diferencial para que:

  1. La copia de seguridad completa solo se realiza el sábado,
    es decir, la copia de seguridad completa en el servidor A el sábado -> enviar al servidor B -> Restaurar la copia de seguridad completa en el servidor B

  2. El resto de los días será una copia de seguridad diferencial,
    es decir, una copia de seguridad diferencial en el servidor A -> enviar al servidor B -> Restaurar la copia de seguridad diferencial en el servidor B

Lo intenté pero recibí un error que decía:

el registro o la copia de seguridad diferencial no se pueden restaurar porque no hay archivos listos para avanzar.

No estoy seguro de por qué. Revisé sys.database_filesel servidor A y el servidor B, y puedo ver que differential_Base_LSNy differential_base_GUIDson iguales. ¿En cualquier lugar / algo más para verificar?

Por cierto, en el paso 2 anterior, cuando estoy restaurando la copia de seguridad diff en el servidor B, ¿siempre necesito restaurar tanto la copia de seguridad completa + la copia de seguridad diferencial cada vez?

Solo restauré la copia de seguridad diferencial WITH RECOVERY(y recibí ese mensaje de error) porque la copia de seguridad completa ya se restauró el día anterior.

Para aclarar: Sí, quiero que la base de datos en el servidor B sea legible entre diferenciales. ¿Cómo puedo evitar eso? ¿Es mi única opción RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)secuencia combinada cada noche?

Cualquier orientación será muy apreciada.

no se nada
fuente

Respuestas:

15

No necesita meterse RECOVERYy NORECOVERYaquí, todo lo que necesita es la STANDBYopción. Aquí hay una demostración rápida sobre cómo usarlo.

Cree una base de datos, configúrela en recuperación simple y cree una tabla.

Insertar datos, tomar algunas diferencias.

Diversión, verdad?

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

Sí, mentí Esa es la parte aburrida.

Puede restaurar su copia de seguridad completa en 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'

Puede restaurar Diffs en orden con 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'

Y a diferencia de esos molestos archivos de registro, también puede saltar al restaurar Diffs:

/*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'

Si desea probar la legibilidad, simplemente ejecute esto entre los comandos de restauración. Debería ver que las ID se incrementan con cada una. Si no lo haces, hiciste algo terriblemente mal.

Tenga en cuenta que cuando restaure archivos, expulsará a los usuarios finales de la base de datos y no esperará a que finalicen sus consultas.

Esto también deja la base de datos en un estado de solo lectura, no se pueden hacer cambios aquí.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

Y finalmente, limpia después de ti mismo.

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

DROP DATABASE DiffRestoreTest

¡¡Espero que esto ayude!!

Erik Darling
fuente