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:
- Voll
- Log
- Voll
- Vollständige Kopie_Nur
- Log
Als nächstes wird die Datenbank wie folgt gelöscht und wiederhergestellt:
- 1. voll
- 1. Log
- 2. Log
Das Folgende SELECT
zeigt, dass die Wiederherstellung erfolgreich war.
Dies zeigt, dass weder eine COP_ONLY
noch eine normale vollständige Sicherung die Protokollkette unterbrechen.
Dann wird die Datenbank erneut gelöscht und wie folgt wiederhergestellt:
- Copy_Only Full
- 2. Log
Danach SELECT
zeigt das wieder Erfolg.
Dies zeigt, dass Sie eine COPY_ONLY
vollständige Sicherung als Basis für Ihre Protokollwiederherstellung verwenden können.
Differentialtests
Ich habe auch eine DIFFERENTIAL
Version 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. voll
- 1. Differential
- 2. voll
- 2. Differential
- Copy_Only Diff
- 3. Differential
Anschließend wird diese Wiederherstellungsroute versucht:
- 1. voll
- 1. Differential
- 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:
- Copy_Only Full
- 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:
- 2. voll
- 2. Differential
- 3. Differential
Die folgende Auswahl belegt, dass diese Wiederherstellung erfolgreich war. Dies zeigt, dass eine COPY_ONLY
vollständige Sicherung die Differentialkette nicht unterbricht.
Folgendes passiert, wenn es sich um Differentiale handelt:
Mit einem Wort: Ja, Sie können eine
COPY_ONLY
Sicherung verwenden, um weitere Protokollsicherungen wiederherzustellen. Was Sie nicht tun können, ist dasCOPY_ONLY
Backup als differenzielle Basis zu verwenden. Das bedeutet, dass Sie keine differenziellen Sicherungen für die wiederhergestellteCOPY_ONLY
Sicherung wiederherstellen können :Wenn Sie dies versuchen, erhalten Sie eine Fehlermeldung:
Differenzielle Sicherungen können schwer zu verstehen sein und sogar erfahrene Datenbankadministratoren täuschen.
quelle