SQL Server 2008 R2 Przywróć pełną kopię zapasową TYLKO KOPIA z dziennikami transakcji

11

Po przeprowadzeniu badań nie mogę znaleźć odpowiedzi na to pytanie.

Tło Próbuję skonfigurować plan tworzenia kopii zapasowych, który spełnia następujące trzy wymagania:

  1. Niezawodność tworzenia kopii zapasowych, co noc pełne kopie zapasowe
  2. Kopie zapasowe dziennika transakcji, z których można przywrócić
  3. Mała ilość wykorzystanego miejsca na dysku
  4. Kopie zapasowe muszą być dostępne lokalnie dla narzędzia kontroli

Więc aby zaspokoić te potrzeby, myślę, że pełne kopie zapasowe co tydzień, różnicowe codziennie i transakcyjne co godzinę. Następnie każdej nocy wykonywana byłaby kopia zapasowa copy_only, którą można wysłać poza siedzibę, ta kopia zapasowa jest wykonywana, aby łańcuch dziennika nie był przerywany, a my mamy niezawodne nocne kopie zapasowe poza siedzibą, bez konieczności pochłaniania tak dużej ilości miejsca na dysku lokalnym.

Pytanie Czy można przywrócić z kopii zapasowej copy_only i później przywrócić dzienniki transakcji.

Pozwól, że podam przykład, abyś wiedział, o czym mówię.

Korzystając z poniższej listy, zastanawiam się, czy można przywrócić FullbackupCOPY_ONLYC.bak, a następnie TransactionbackupG.trn, TransactionbackupH.trn, wreszcie TransactionbackupI.trn

> ---List of Backups---   
FullbackupA.bak 01/01/2013 00:00:00   
>  DifferntialbackupA.bak 02/01/2013 00:00:00 
FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00
>     TransactionbackupA.trn 02/01/2013 01:00:00
>     TransactionbackupB.trn 02/01/2013 02:00:00
>     TransactionbackupC.trn 02/01/2013 03:00:00
>  DifferntialbackupB.bak 03/01/2013 00:00:00 
FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00
>     TransactionbackupD.trn 03/01/2013 01:00:00
>     TransactionbackupE.trn 03/01/2013 02:00:00
>     TransactionbackupF.trn 03/01/2013 03:00:00
>  DifferntialbackupC.bak 04/01/2013 00:00:00 
FullbackupCOPY_ONLYC.bak 04/01/2013 00:00:00
>     TransactionbackupG.trn 04/01/2013 01:00:00
>     TransactionbackupH.trn 04/01/2013 02:00:00
>     TransactionbackupI.trn 04/01/2013 03:00:00

Być może cała ta konfiguracja nie jest rozsądna. Jestem dość nowy w SQL Server i staram się uczyć, gdy idę. Wszelkie porady / pomoc będą mile widziane.

dv10t
źródło

Odpowiedzi:

14

Pełna kopia zapasowa w SQL Server 2008 nie przerywa łańcucha dziennika. Resetuje tylko różnicowy base-lsn.

Można również przywrócić kopie zapasowe dziennika po przywróceniu tylko z kopii. Poniższe wersje demonstracyjne skryptu, które:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

Tworzy bazę danych i tabelę i wstawia do niej 50 wierszy. Pomiędzy tymi wstawkami wykonanych jest kilka kopii zapasowych w następującej kolejności:

  1. Pełny
  2. Log
  3. Pełny
  4. Pełna kopia tylko
  5. Log

Następnie baza danych jest usuwana i przywracana w następujący sposób:

  1. 1. pełne
  2. 1. dziennik
  3. 2nd Log

Poniżej SELECTpokazano, że przywracanie zakończyło się powodzeniem.

To pokazuje, że COP_ONLYani normalna, ani pełna kopia zapasowa nie przerywają łańcucha dziennika.

Następnie baza danych jest ponownie usuwana i przywracana w następujący sposób:

  1. Copy_Only Full
  2. 2nd Log

Potem znów SELECTpokazuje sukces.

To pokazuje, że możesz użyć COPY_ONLYpełnej kopii zapasowej jako podstawy przywracania dziennika.

Testy różnicowe

Stworzyłem też DIFFERENTIALwersję:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_3' WITH DIFFERENTIAL,INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F1, D1, D2',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_1' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore FC, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F2, D2, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

To zajmuje kopie zapasowe w tej kolejności:

  1. 1. pełne
  2. 1. dyferencjał
  3. 2. pełne
  4. 2. dyferencjał
  5. Copy_Only Diff
  6. 3 dyferencjał

Następnie próbuje wykonać tę trasę przywracania:

  1. 1. pełne
  2. 1. dyferencjał
  3. 2. dyferencjał

Krok 3 kończy się niepowodzeniem z powodu tego błędu:

Msg 3136, Level 16, State 1, Line 4
This differential backup cannot be restored because the database has not been restored to the correct earlier state.

To pokazuje, że normalna pełna kopia zapasowa przerywa łańcuch różnicowy.

Następnie baza danych jest usuwana i następuje próba przywrócenia:

  1. Copy_Only Full
  2. 3 dyferencjał

Krok 2 kończy się niepowodzeniem z takim samym błędem jak krok 3 powyżej. To pokazuje, że kopia zapasowa tylko kopii nie może być używana jako podstawa do różnicowego przywracania.

Następnie baza danych jest ponownie usuwana i wykonywane jest następujące przywracanie:

  1. 2. pełne
  2. 2. dyferencjał
  3. 3 dyferencjał

Poniższy wybór potwierdza, że ​​przywracanie powiodło się. To pokazuje, że COPY_ONLYpełna kopia zapasowa nie przerywa łańcucha różnicowego.

Sebastian Meine
źródło
Szukałem informacji, czy możesz zastosować dziennik transakcji do pełnej kopii zapasowej copy_only. To naprawdę dobra informacja!
Brain2000,
2

Oto, co dzieje się, gdy w grę wchodzą różnice:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 10 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 20 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 30 rows so far
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 40 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 50 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 60 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 70 rows so far
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO


USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70: log chain not broken
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70
GO
DROP DATABASE BakTst13;

Jednym słowem: tak, możesz użyć COPY_ONLYkopii zapasowej, aby przywrócić kolejne kopie zapasowe dziennika. Nie możesz użyć COPY_ONLYkopii zapasowej jako bazy różnicowej. Oznacza to, że nie będzie można przywrócić różnicowych kopii zapasowych na przywróconej COPY_ONLYkopii zapasowej:

DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;

Jeśli spróbujesz tego, pojawi się błąd:

Processed 160 pages for database 'BakTst13', file 'BakTst13' on file 1.
Processed 2 pages for database 'BakTst13', file 'BakTst13_log' on file 1.
RESTORE DATABASE successfully processed 162 pages in 0.009 seconds (139.811 MB/sec).
Msg 3136, Level 16, State 1, Line 2
This differential backup cannot be restored because the database has not been restored to the correct earlier state.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

Różnicowe kopie zapasowe mogą być trudne do zrozumienia i mogą oszukać nawet doświadczonych DBA.

spaghettidba
źródło