SQL Server 2008 R2 Vollständige Sicherung von COPY_ONLY mit Transaktionsprotokollen wiederherstellen

11

Nach einigen Recherchen kann ich keine Antwort auf diese Frage finden.

Hintergrund Ich versuche, einen Sicherungsplan einzurichten, der die folgenden drei Anforderungen erfüllt:

  1. Zuverlässigkeit von Backups mit nächtlichen vollständigen Backups
  2. Transaktionsprotokollsicherungen, aus denen wiederhergestellt werden konnte
  3. Geringer Platzbedarf
  4. Auf die Sicherungen muss für ein Überwachungstool lokal zugegriffen werden können

Um diesen Anforderungen gerecht zu werden, denke ich an vollständige Backups wöchentlich, differenzielle tägliche und stündliche Transaktionen. Dann würde jede Nacht eine copy_only-Sicherung ausgeführt, die außerhalb des Standorts versendet werden kann. Diese Sicherung wird durchgeführt, damit die Protokollkette nicht unterbrochen wird, und wir haben zuverlässige nächtliche vollständige Sicherungen außerhalb des Standorts, ohne so viel lokalen Speicherplatz verbrauchen zu müssen.

Frage Ist es möglich, aus der copy_only-Sicherung wiederherzustellen und die Transaktionsprotokolle danach wiederherzustellen?

Lassen Sie mich nur ein Beispiel geben, damit Sie wissen, wovon ich spreche.

Anhand der folgenden Liste frage ich mich, ob es möglich ist, FullbackupCOPY_ONLYC.bak wiederherzustellen, gefolgt von TransactionbackupG.trn, TransactionbackupH.trn und schließlich 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

Vielleicht ist dieses ganze Setup nicht vernünftig. Ich bin ziemlich neu in SQL Server und versuche zu lernen, wie ich gehe. Jeder Rat / Hilfe wäre dankbar.

dv10t
quelle

Antworten:

14

Eine vollständige Sicherung in SQL Server 2008 unterbricht die Protokollkette nicht. Es wird nur das Differential base-lsn zurückgesetzt.

Sie können Protokollsicherungen auch nach dem Wiederherstellen nur von einer Kopie wiederherstellen. Die folgenden Skriptdemos, die:

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;

Es erstellt eine Datenbank und eine Tabelle und fügt 50 Zeilen in diese Tabelle ein. Zwischen diesen Einfügungen werden mehrere Sicherungen in dieser Reihenfolge erstellt:

  1. Voll
  2. Log
  3. Voll
  4. Vollständige Kopie_Nur
  5. Log

Als nächstes wird die Datenbank wie folgt gelöscht und wiederhergestellt:

  1. 1. voll
  2. 1. Log
  3. 2. Log

Das Folgende SELECTzeigt, dass die Wiederherstellung erfolgreich war.

Dies zeigt, dass weder eine COP_ONLYnoch eine normale vollständige Sicherung die Protokollkette unterbrechen.

Dann wird die Datenbank erneut gelöscht und wie folgt wiederhergestellt:

  1. Copy_Only Full
  2. 2. Log

Danach SELECTzeigt das wieder Erfolg.

Dies zeigt, dass Sie eine COPY_ONLYvollständige Sicherung als Basis für Ihre Protokollwiederherstellung verwenden können.

Differentialtests

Ich habe auch eine DIFFERENTIALVersion erstellt:

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;

Dies erfordert Backups in dieser Reihenfolge:

  1. 1. voll
  2. 1. Differential
  3. 2. voll
  4. 2. Differential
  5. Copy_Only Diff
  6. 3. Differential

Anschließend wird diese Wiederherstellungsroute versucht:

  1. 1. voll
  2. 1. Differential
  3. 2. Differential

Schritt 3 schlägt mit diesem Fehler fehl:

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.

Dies zeigt, dass eine normale vollständige Sicherung die Differentialkette unterbricht.

Als nächstes wird die Datenbank gelöscht und dieser Wiederherstellungsfluss wird versucht:

  1. Copy_Only Full
  2. 3. Differential

Schritt 2 schlägt mit demselben Fehler wie Schritt 3 oben fehl. Dies zeigt, dass eine Nur-Kopie-Sicherung nicht als Basis für eine differenzielle Wiederherstellung verwendet werden kann.

Dann wird die Datenbank erneut gelöscht und die folgende Wiederherstellung ausgeführt:

  1. 2. voll
  2. 2. Differential
  3. 3. Differential

Die folgende Auswahl belegt, dass diese Wiederherstellung erfolgreich war. Dies zeigt, dass eine COPY_ONLYvollständige Sicherung die Differentialkette nicht unterbricht.

Sebastian Meine
quelle
Ich habe nach Informationen gesucht, ob Sie ein Transaktionsprotokoll auf eine vollständige Kopie von copy_only anwenden können. Das sind wirklich gute Informationen!
Brain2000
2

Folgendes passiert, wenn es sich um Differentiale handelt:

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;

Mit einem Wort: Ja, Sie können eine COPY_ONLYSicherung verwenden, um weitere Protokollsicherungen wiederherzustellen. Was Sie nicht tun können, ist das COPY_ONLYBackup als differenzielle Basis zu verwenden. Das bedeutet, dass Sie keine differenziellen Sicherungen für die wiederhergestellte COPY_ONLYSicherung wiederherstellen können :

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

Wenn Sie dies versuchen, erhalten Sie eine Fehlermeldung:

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.

Differenzielle Sicherungen können schwer zu verstehen sein und sogar erfahrene Datenbankadministratoren täuschen.

spaghettidba
quelle