Procedura odzyskiwana kopii zapasowej baz danych w SQL Server jest uzależniona głównie od modelu odzyskiwania (RECOVERY MODEL
), która powinna być determinowana przez wymagania biznesowe. Dziwne w sumie gdyby było inaczej, lecz dzisiaj nie o tym.
Dla modelu SIMPLE sprawa jest prosta i opiera się głównie na odzyskaniu dostępnej, sprawnej pełnej kopii zapasowej. W przypadku modelu FULL mamy znacznie więcej możliwość. Taką bazę możemy odzyskać do konkretnego punktu w czasie posługując się w odpowiedniej kolejności kopią pełną i różnicowymi. Gdzie po między jednym a drugim może wystąpić kopia przyrostowa/ kopie przyrostowe.
W dużym uproszczeniu wygląda to mniej więcej tak.
1 2 3 4 5 6 7 8 9 10 11 12 |
USE MASTER GO RESTORE DATABASE [AdventureWorks2014] FROM DISK = N'C:\SQLBackup\f_AW_19102018.bak' WITH REPLACE, NORECOVERY GO RESTORE LOG [AdventureWorks2014] FROM DISK = N'C:\SQLBackup\l_AW_19102018_1.bak' WITH NORECOVERY, STOPAT= '2018-10-16 21:27:46.347' GO ... RESTORE LOG [AdventureWorks2014] FROM DISK = N'C:\SQLBackup\l_AW_19102018_10.bak' WITH RECOVERY, STOPAT= '2018-10-16 21:27:46.347' GO |
W trakcie odtwarzania baza przechodzi w tryb Restoring
gdzie dostęp do danych nie jest możliwy. Ostatnie polecenie z opcją RECOVERY
powoduję dopiero wycofanie niezakończonych transakcji i pozostawienie bazy w stanie ONLINE. W tym momencie mamy dostęp do danych.
Jednak jakiś czas temu dostałem pytanie.
Czy możliwy jest dostęp do danych w trakcie odzyskiwania?
Odpowiedź brzmi: tak
Wrócimy na moment do polecenia RESTORE
a dokładnie do opcji stanu odzyskiwania.
- RESTORE WITH RECOVERY- pozostawia bazę danych niedziałającą i nie wycofuję niezatwierdzonych transakcji. Umożliwia odzyskiwanie kolejnych logów transakcji,
- RESTORE WITH NORECOVERY – pozostawia bazę danych gotową do użycia, wycofując niezatwierdzone transakcje. Kolejne logi transakcyjne nie mogą zostać przywrócone,
- RESTORE WITH STANDBY – pozostawia bazę danych w trybie tylko do odczytu (
standby/read only
). Wycofuję niezatwierdzone transakcje, ale co ważne zapisuję je w pliku w celu, aby można było kontynuować odzyskiwanie kolejnych logów transakcyjnych
RESTORE
z opcją WITH STANDBY =standby_file_name
jest poleceniem, które umożliwia odzyskiwanie logów transakcyjnych step by step z opcją odczytu danych.
1 2 3 4 5 6 7 8 |
USE MASTER GO RESTORE DATABASE [AdventureWorks2014] FROM DISK = N'C:\SQLBackup\f_AW_19102018.bak' WITH REPLACE, NORECOVERY GO RESTORE LOG [AdventureWorks2014] FROM DISK = N'C:\SQLBackup\l_AW_19102018_1.bak' WITH STANDBY = 'C:\App\Microsoft SQL Server\Data14\AW_Standby.bak', STOPAT= '2018-10-16 21:41:48.093' GO |
Między każdym odzyskaniem możliwy jest odczyt danych i kontynuowanie odzyskiwanie kolejnego logu transakcyjnego.
1 2 3 |
RESTORE LOG [AdventureWorks2014] FROM DISK = N'C:\SQLBackup\l_AW_19102018_3.bak' WITH STANDBY = 'C:\App\Microsoft SQL Server\Data14\AW_Standby.ndf', STOPAT= '2018-10-19 21:41:48.093' GO |
W dokładnie taki sposób Log Shipping realizuję możliwość odczytu na bazie secondary, ale to już tylko jako ciekawostka.

Mateusz Nadobnik
Z pasją poświęcam czas na zdobywanie wiedzy w zakresie szeroko rozumianej Data Platform. Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.
read more