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.