Problem z różnicową kopią zapasową - dlaczego? Czy to możliwe?

13

Korzystam z programu SQL Server 2014 i taka jest sytuacja:

  • Mam serwer A i serwer B.
  • Nocleg ETL jest przetwarzany na serwerze A.
  • Po zakończy proces ładowania, baza X pobiera kopii zapasowej (z CHECKSUMi RESTORE VERIFYONLYaby zapewnić niezawodność) i następnie wysyłane do serwera B.
  • Serwer B odbiera bakplik, a następnie przywraca tam bazę danych.

Chcę użyć różnicowej strategii tworzenia kopii zapasowych, aby:

  1. Pełna kopia zapasowa jest wykonywana tylko w sobotę,
    tj. Pełna kopia zapasowa na serwerze A w sobotę -> wysyłamy na serwer B -> Przywróć pełną kopię zapasową na serwerze B

  2. Reszta dni to kopia
    różnicowa, tzn. Kopia różnicowa na serwerze A -> wysyłka na serwer B -> przywracanie kopii zapasowej różnicowej na serwerze B

Próbowałem, ale dostałem błąd, mówiąc:

nie można przywrócić kopii zapasowej dziennika lub różnicowej, ponieważ żadne pliki nie są gotowe do przywrócenia.

Nie pewny dlaczego. Sprawdziłem sys.database_filesna serwerze A i serwerze B i widzę, że differential_Base_LSNi differential_base_GUIDsą takie same. Gdziekolwiek / coś jeszcze do sprawdzenia?

Przy okazji, w kroku 2 powyżej, kiedy przywracam kopię zapasową diff na serwerze B, czy zawsze muszę przywracać zarówno kopię pełną, jak i różnicową?

Przywróciłem różnicową kopię zapasową WITH RECOVERY(i dostałem ten komunikat o błędzie), ponieważ pełna kopia zapasowa została przywrócona już dzień wcześniej.

Aby wyjaśnić: Tak, chcę, aby db na serwerze B był czytelny między różnicami. Jak mogę to obejść? Czy moją jedyną opcją jest RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)sekwencja combo każdej nocy?

Wszelkie wskazówki będą mile widziane.

nic nie wiem
źródło

Odpowiedzi:

15

Nie trzeba zadzierać z RECOVERYa NORECOVERYtu wszystko, czego potrzebujesz jest STANDBYrozwiązaniem. Oto krótkie demo, jak z niego korzystać.

Utwórz bazę danych, ustaw proste odzyskiwanie i utwórz tabelę.

Wstaw dane, weź trochę różnic.

Zabawa, prawda?

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

Tak, skłamałem. To nudna część.

Możesz przywrócić pełną kopię zapasową w 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'

Możesz przywrócić Diffs w następującej kolejności 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'

I w przeciwieństwie do tych nieznośnych plików dziennika, możesz pominąć także przywracanie 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'

Jeśli chcesz przetestować czytelność, po prostu uruchom to pomiędzy poleceniami przywracania. Powinieneś zobaczyć przyrost identyfikatorów z każdym. Jeśli nie, zrobiłeś coś okropnie złego.

Pamiętaj, że przywrócenie plików spowoduje usunięcie wszystkich użytkowników końcowych z bazy danych i nie będzie czekać na zakończenie ich zapytań.

Pozostawia to również bazę danych w stanie tylko do odczytu, nie można tutaj wprowadzać żadnych zmian.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

I wreszcie posprzątaj po sobie.

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

DROP DATABASE DiffRestoreTest

Mam nadzieję że to pomoże!!

Erik Darling
źródło