Problema di backup differenziale - Perché? È possibile?


13

Sto usando SQL Server 2014 e questa è la situazione:

  • Ho il server A e il server B.
  • ETL notturno viene elaborato sul server A.
  • Una volta completato il processo di caricamento, viene eseguito il backup del database X (con CHECKSUMe RESTORE VERIFYONLYper garantire l'affidabilità) e quindi inviato al server B.
  • Il server B riceve il bakfile e quindi ripristina il database lì.

Voglio utilizzare la strategia di backup differenziale in modo che:

  1. Il backup completo viene eseguito solo il sabato,
    ovvero il backup completo sul server A il sabato -> spedisci al server B -> Ripristina il backup completo sul server B

  2. Il resto dei giorni sarà backup differenziale,
    ovvero backup differenziale sul server A -> spedizione al server B -> Ripristino del backup differenziale sul server B

Ho provato ma ho ricevuto un errore dicendo:

il log o il backup differenziale non possono essere ripristinati perché nessun file è pronto per il rollforward.

Non so perché. Ho controllato sys.database_filesil server A e il server B e vedo che differential_Base_LSNe differential_base_GUIDsono uguali. Ovunque / qualcos'altro da controllare?

A proposito, al passaggio 2 sopra, quando ripristino il backup diff sul server B, devo sempre ripristinare sia il backup completo + il backup differenziale ogni volta?

Ho ripristinato solo il backup differenziale WITH RECOVERY(e ho ricevuto quel messaggio di errore) perché il backup completo è stato ripristinato già il giorno prima.

Per chiarire: Sì, voglio che il db sul server B sia leggibile tra i differenziali. Come posso aggirarlo? La mia unica opzione per RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)sequenza combo è ogni notte?

Qualsiasi consiglio sarà molto apprezzato.

Risposte:


15

Non hai bisogno di scherzare RECOVERYe NORECOVERYqui, tutto ciò che serve è l' STANDBYopzione. Ecco una breve demo su come usarlo.

Creare un database, impostarlo su ripristino semplice e creare una tabella.

Inserisci i dati, prendi alcune differenze.

Divertimento vero?

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ì, ho mentito. Questa è la parte noiosa.

È possibile ripristinare il backup completo in 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'

È possibile ripristinare Diffs in ordine 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'

E a differenza di quei fastidiosi file di log, puoi anche saltare avanti quando ripristini 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'

Se si desidera verificare la leggibilità, basta eseguirlo tra i comandi di ripristino. Dovresti vedere gli ID incrementare con ciascuno. In caso contrario, hai fatto qualcosa di orribilmente sbagliato.

Tenere presente che quando si ripristinano i file, verranno espulsi dal database tutti gli utenti finali e non si attende il completamento delle loro query.

Questo lascia anche il database in uno stato di sola lettura, qui non è possibile apportare modifiche.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

E infine, ripulisci dopo te stesso.

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

DROP DATABASE DiffRestoreTest

Spero che sia di aiuto!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.