SQL Server 2012 Wiederherstellen der Sicherung unter neuem DB-Namen

16

Ich erinnere mich anscheinend, dass Sie 2008 eine Sicherung in einer neuen Kopie einer Datenbank wiederherstellen konnten, indem Sie den Namen im Feld "Zieldatenbank" des Wiederherstellungsassistenten änderten. Es wird eine brandneue Datenbank erstellt, bei der es sich um eine Kopie der ursprünglichen Datenbank handelt, die zu dem von Ihnen gewünschten Zeitpunkt wiederhergestellt wurde. Ich habe nicht für mein ganzes Leben herausgefunden, wie man SQL 2012 dazu bringt, dies zu tun.

Jetzt verstehe ich (dank Aaron Bertrand), dass sich dies nicht wirklich geändert hat und dass 2012 mir klarer macht, dass diese Strategie von Anfang an eine schlechte Idee war!

Ich muss also Folgendes tun: Erstellen Sie eine neue Datenbank 'MyDB_Copy' aus einer vorhandenen Datenbank 'MyDB', indem Sie deren Sicherungsdateien verwenden. Wir haben nächtliche vollständige Backups (.bak) und alle 15 Minuten TLogs (.trn). Ich möchte nicht, dass die bestehende 'MyDB' beeinflusst wird, weil sie "live" ist.

Nachdem die MyDB_Copy aus der Hauptsicherungsdatei erstellt wurde, muss ich ein paar Dutzend TLog-Sicherungen wiederherstellen, um sie zu einem bestimmten Zeitpunkt wiederherzustellen.

NateJ
quelle
Können Sie oder Aaron mitteilen, warum dies eine schlechte Idee ist? oder auf das Thema verlinken, wo es erklärt wird?
Thronk
Ich glaube, es geht darum, dass die logischen Namen nicht geändert werden, und daher würden Sie zwei DBs am selben Ort haben, die unterschiedliche Namen und physische Dateien, aber identische logische Namen haben, was Probleme für die abhängigen Wartungspläne verursacht auf logische Namen. In meiner Situation haben diese wiederhergestellten / kopierten DBs nie länger als ein paar Stunden gedauert, aber ich kann verstehen, warum dies keine großartige Übung ist.
NateJ

Antworten:

18

Öffnen Sie in Anlehnung an Beispiel E in der Dokumentation ein neues Abfragefenster und führen Sie Folgendes aus:

RESTORE DATABASE MyDB_Copy FROM DISK = 'C:\blahblah\MyDB.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'MyDB' TO 'C:\blahblah\Data\MyDB_Copy.mdf',
---------------------------------------^^^^^
  MOVE 'MyDB_log' TO 'C:\blahblah\Data\MyDB_Copy.ldf';
-------------------------------------------^^^^^

Die logischen Namen sind nicht wichtig. Die physischen Dateinamen sind. Dies macht Annahmen über Ihre logischen Dateinamen und dass es nur zwei gibt; laufe EXEC MyDB..sp_helpfile;um sicher zu gehen.

Wenn Sie Protokolle wiederherstellen müssen, wechseln Sie RECOVERYzu NORECOVERY:

  WITH REPLACE, NORECOVERY,
----------------^^

Dann können Sie eine Reihe von:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\file1.trn' WITH NORECOVERY;

Und am allerletzten:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH RECOVERY;

Oder wenn Sie nur einen Teil einer Anmeldung bis zu einem bestimmten Zeitpunkt benötigen (ich gehe davon aus, dass Sie überprüft haben, wo sich die LSNs und Zeiten befinden, sodass Sie genau wissen, welche Dateien Sie benötigen):

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH 
  STOPAT = '<some point in time Friday>', RECOVERY;

Die Art und Weise, wie Sie in früheren Versionen sagten, hätte niemals funktioniert, es sei denn, die Sicherung stammte von einem anderen Server. Standardmäßig wird versucht, die neuen mdf- und ldf-Dateien genau am selben Ort abzulegen. Dies ist jedoch nicht möglich.

Aaron Bertrand
quelle
Okay, das hat ein bisschen geholfen. Jetzt muss ich ein paar Dutzend TRN-Dateien wiederherstellen, um die Datenbank wieder in den Zustand zu versetzen, in dem es Freitag Nacht war (die vollständigen Sicherungen erfolgen nur täglich; die TLog-Sicherungen erfolgen alle 15 Minuten). Anhand Ihres Beispiels habe ich die Datenbank aus der Haupt-BAK-Datei erstellt, aber beim Versuch, eine ähnliche Anweisung zum Wiederherstellen des Protokolls zu verwenden, wird ein neuer Fehler angezeigt. "Das Protokoll oder die differenzielle Sicherung kann nicht wiederhergestellt werden, da keine Dateien für die aktualisierende Wiederherstellung bereit sind".
NateJ
@NateJ Sie sollten dann eine vollständige Frage stellen. :-)
Aaron Bertrand
1
Genial, ich schreibe es jetzt! Vielen Dank für deine Hilfe. Ich bin verblüfft, dass ich ein paar negative Wiederholungen bei StackOverflow habe, aber wenn das klappt, wird es sich lohnen.
NateJ
1
@NateJ Sie sollten diesen Mitarbeiter zurückerhalten, da die Frage bei der Migration gelöscht wurde (oder wird). Ich war es nicht, aber ich vermute, es lag an Ihrer Anschuldigung, dass dies in einer Version funktioniert hat, aber jetzt nicht, wenn dies eindeutig nur ein Missverständnis dessen ist, was passiert ist ...
Aaron Bertrand
Oh, ich verstehe. So etwas hat früher funktioniert - ich erinnere mich vielleicht nicht genau, was / wie, aber ich stimme zu, dass es missverstanden wurde. Mein Kollege schwört auf und ab, aber jetzt, wo ich darüber nachdenke, ergibt es keinen Sinn. Wir müssen etwas anders gemacht haben, mit der GUI. Ich habe das Gefühl, dass die von Ihnen vorgeschlagenen Befehle / Skripte für uns besser sein werden. :) Die Protokolle werden jetzt wiederhergestellt, bisher erfolgreich!
NateJ
0

Um dieselbe Datenbank mehrmals wiederherzustellen, müssen Sie lediglich den Namen der Festplattendateien für diese Datenbank ändern. Natürlich müssen Sie der Datenbank auch in SQL Server einen anderen Namen geben. Nachdem Sie in SSMS die .bak-Datei für die Wiederherstellung ausgewählt und den Namen für die Datenbank eingegeben haben, klicken Sie links im Abschnitt "Seite auswählen" auf "Dateien" und ändern lediglich den Namen der Festplattendateien.

Prost Doug

Doug
quelle