Differential Backup-Problem - Warum? Ist das möglich?

13

Ich verwende SQL Server 2014 und dies ist die Situation:

  • Ich habe Server A und Server B.
  • Übernacht-ETL wird auf Server A verarbeitet.
  • Nach Abschluss des Ladevorgangs wird die Datenbank X gesichert (mit CHECKSUMund RESTORE VERIFYONLYum die Zuverlässigkeit zu gewährleisten) und dann an Server B gesendet.
  • Server B empfängt die bakDatei und stellt dort die Datenbank wieder her.

Ich möchte eine differenzielle Sicherungsstrategie verwenden, damit:

  1. Eine vollständige Sicherung wird nur am Samstag durchgeführt,
    dh vollständige Sicherung auf Server A am Samstag -> an Server B senden -> vollständige Sicherung auf Server B wiederherstellen

  2. Der Rest der Tage ist Differenzsicherung,
    dh Differenzsicherung auf Server A -> Versand an Server B -> Wiederherstellung der Differenzsicherung auf Server B

Ich habe es versucht, habe aber einen Fehler erhalten und gesagt:

Das Protokoll oder die differenzielle Sicherung kann nicht wiederhergestellt werden, da keine Dateien für die aktualisierende Wiederherstellung bereit sind.

Nicht sicher warum. Ich habe sys.database_filesServer A und Server B überprüft , und ich kann sehen, dass das differential_Base_LSNund differential_base_GUIDdas gleiche sind. Überall / irgendetwas anderes zu überprüfen?

Muss ich übrigens in Schritt 2 beim Wiederherstellen der Diff-Sicherung auf Server B jedes Mal sowohl die vollständige Sicherung als auch die differenzielle Sicherung wiederherstellen?

Ich habe nur die differenzielle Sicherung wiederhergestellt WITH RECOVERY(und diese Fehlermeldung erhalten), weil die vollständige Sicherung bereits am Vortag wiederhergestellt wurde.

Zur Verdeutlichung: Ja, ich möchte, dass die Datenbank auf Server B zwischen den Differentialen lesbar ist. Wie kann ich das umgehen? Kann ich nur jede Nacht eine RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)Combo-Sequenz auswählen?

Jede Anleitung wird sehr geschätzt.

Ich weiß nichts
quelle

Antworten:

15

Sie müssen sich nicht damit anlegen RECOVERYund NORECOVERYhier ist alles, was Sie brauchen, die STANDBYOption. Hier ist eine kurze Demo, wie man es benutzt.

Erstellen Sie eine Datenbank, stellen Sie die einfache Wiederherstellung ein, und erstellen Sie eine Tabelle.

Daten einfügen, Unterschiede machen.

Spaß, richtig?

USE master;

/*Create a dummy database*/
CREATE DATABASE DiffRestoreTest

/*We simple now*/
ALTER DATABASE DiffRestoreTest SET RECOVERY SIMPLE

/*Context is everything*/
USE DiffRestoreTest

/*If nothing changes, do we even need a diff backup?*/
CREATE TABLE dbo.t1 (Id INT)

/*Take a full backup, dummy*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_FULL.bak' 
WITH INIT, FORMAT, COMPRESSION

/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )

/*Take a differential backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest  
TO DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

Ja, ich habe gelogen. Das ist der langweilige Teil.

Sie können Ihre vollständige Sicherung wiederherstellen in STANDBY:

/*Exit stage left*/
USE master

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Sie können Diffs in der folgenden Reihenfolge wiederherstellen STANDBY:

/*Square one*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 2*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 3*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Und im Gegensatz zu diesen lästigen Protokolldateien können Sie auch beim Wiederherstellen von Diffs vorwärts springen:

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*What happens if I try to jump the restores?*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

Wenn Sie die Lesbarkeit testen möchten, führen Sie dies einfach zwischen den Wiederherstellungsbefehlen aus. Sie sollten sehen, dass die IDs mit jedem erhöht werden. Wenn Sie dies nicht tun, haben Sie schrecklich viel falsch gemacht.

Beachten Sie, dass beim Wiederherstellen von Dateien alle Endbenutzer aus der Datenbank entfernt werden und nicht darauf gewartet wird, dass ihre Abfragen beendet werden.

Dadurch bleibt die Datenbank auch schreibgeschützt. Hier können keine Änderungen vorgenommen werden.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

Und zum Schluss, räume auf nach dir.

/*Bring'er online, lad*/
RESTORE DATABASE DiffRestoreTest WITH RECOVERY

DROP DATABASE DiffRestoreTest

Hoffe das hilft!!

Erik Darling
quelle