Kluczową różnicą między kopiami pełnymi a kopiami tylko do kopiowania jest to, czy LSN (numer sekwencji dziennika), a konkretnie DatabaseBackupLSN
jest aktualizowany.
Po wykonaniu pełnej kopii zapasowej DatabaseBackupLSN
jest ona aktualizowana. Po zrobieniu pełnej kopii zapasowej, jeśli wykonasz różnicową kopię zapasową, ta kopia będzie DatabaseBackupLSN
pasowała do kopii pełnej, a zatem SQL może połączyć obie (np. Wie z tych LSN, że diff wykonał pełną kopię).
Problem pojawia się, gdy masz zaplanowane kopie zapasowe, więc masz początkową pełną kopię zapasową, a następnie sekwencję różnicową. Jeśli ręcznie wykonasz pełną kopię zapasową, zaktualizuje ona LSN, a następnie od tego momentu każda różnicowa kopia zapasowa, którą wykonasz za pomocą zaplanowanej kopii zapasowej, będzie wskazywać, że nowa LSN nie jest oryginalna. W przypadku konieczności przywrócenia można przywrócić zaplanowaną pełną kopię zapasową, ale próba przywrócenia dowolnej kopii zapasowej różnicowej wykonanej po ręcznym zadaniu może zakończyć się niepowodzeniem, ponieważ LSN nie będą już pasować.
W przypadku kopii zapasowej tylko do kopiowania nie dotyka DatabaseBackupLSN
, a zatem nie przerywa łańcucha kopii zapasowych.
Jest dobry opis tego problemu, a także dlaczego tak wiele osób go nie rozumie w Przerwaniu łańcucha zapasowego - REDUX (lub Jedzenie Crow) Michaela K. Campbella, który zawiera dobre wizualne przewodniki takie jak ten:
Aby uzyskać dobre wyjaśnienie czterech różnych LSN i sposobu ich użycia, zapoznaj się z artykułem Zrozumienie numerów sekwencji dziennika SQL Server dla kopii zapasowych autorstwa Simona Liewa.
Sposobem na uniknięcie tego problemu jest nie więcej niż jedna operacja wykonywania standardowych kopii zapasowych bazy danych. Wszelkie doraźne lub wtórne kopie zapasowe powinny być wykonywane z opcją tylko do kopiowania, zobacz Pełne kopie zapasowe (SQL Server), aby uzyskać szczegółowe informacje, ale zasadniczo używasz opcji „Kopiuj tylko do kopii zapasowej” w SSMS, za pomocą T-SQL określ WITH COPY_ONLY
w poleceniu lub w PowerShell użyj -CopyOnly
parametru.
Załóżmy, że mamy bazę danych z zaplanowanymi kopiami zapasowymi. Pełna kopia zapasowa jest uruchamiana raz na 24 godziny o 00:00, mamy także różnicowe kopie zapasowe, które działają co 6 godzin, oraz kopie zapasowe dziennika transakcji, które są uruchamiane co godzinę. Co więc, jeśli musimy wykonać dodatkową pełną kopię zapasową w środku dnia, aby przywrócić inny serwer? Co powinniśmy zrobić w tym przypadku. Oczywiście możemy wykonać pełną kopię zapasową.
BACKUP DATABASE Test TO DISK = 'C:/Test.bak'
Jednak podczas tworzenia kopii zapasowej bazy danych zachodzą pewne zmiany, które wpływają na sposób przywrócenia następujących kopii zapasowych (kopie różnicowe i kopie zapasowe dziennika transakcji wpływają na to, jak będzie przebiegać operacja przywracania). W takim przypadku wszystkie kolejne różnicowe kopie zapasowe będą zależały od ostatniej pełnej kopii zapasowej. W przypadku utraty ostatniej pełnej kopii zapasowej przywracanie bazy danych jest niemożliwe.
Ale w jaki sposób możemy wykonać kopię zapasową, która nie wpłynie na następujące procesy tworzenia kopii zapasowej lub przywracania dla tej bazy danych. To tutaj powstają kopie zapasowe tylko do kopiowania.
BACKUP DATABASE Test TO DISK = 'C:\Test.bak' WITH COPY_ONLY
źródło
Gdy masz pełną kopię zapasową i zestaw kopii zapasowych pliku dziennika, łańcuch dziennika jest utrzymywany przy użyciu LSN (numer sekwencji dziennika). Jeśli chcesz wykonać kopię zapasową bez przerywania łańcucha dziennika, wykonaj kopię zapasową tylko do kopiowania.
Jeśli nie wykonasz kopii zapasowej tylko do kopiowania, łańcuch dziennika zostanie przerwany, a tworzona kopia zapasowa będzie najnowszą pełną kopią zapasową. Oznacza to, że poprzednich kopii zapasowych dziennika nie można zastosować do nowo wykonanych pełnych kopii zapasowych. Łańcuch dziennika jest w większości utrzymywany w celu odzyskania punktu lub scenariuszy wysyłki dziennika.
Na przykład: powiedzmy, że masz scenariusz tworzenia kopii zapasowych, który wykonuje pełne kopie zapasowe co 6 godzin (północ, 6 rano, w południe, 18:00) i zapisuje kopie zapasowe co 15 minut. O 9 rano przychodzi żądanie umieszczenia kopii bazy danych na serwerze testowym. Chcesz wykonać kopię zapasową bez przerywania łańcucha dziennika lub zakłócania zadań tworzenia kopii zapasowych. Dzieje się tak, gdy wykonywana jest kopia zapasowa tylko do kopiowania. Kopia zapasowa tylko do kopiowania nie zakłóci regularnych zestawów kopii zapasowych.
źródło
Pełna kopia zapasowa i kopia tylko do kopiowania nie przerywają łańcucha dziennika. tylko jeśli wykonasz kopię zapasową tlog, wystąpi niedopasowanie LSN.
źródło