SQL Server 2012 Przywróć kopię zapasową do nowej nazwy DB

16

Wydaje mi się, że pamiętam, że w 2008 r. Można przywrócić kopię zapasową do nowej kopii bazy danych, zmieniając nazwę w polu „Docelowa baza danych” w kreatorze przywracania. Stworzyłoby to zupełnie nową bazę danych, która jest kopią oryginalnej bazy danych przywróconą do momentu, w którym chciałeś. Nie zastanawiałem się przez całe życie, jak sprawić, by SQL 2012 to robił.

Teraz rozumiem (dzięki Aaronowi Bertrandowi), że tak naprawdę to się nie zmieniło i że w 2012 r. Jest dla mnie bardziej oczywiste, że ta strategia była kiepskim pomysłem!

Więc muszę to zrobić: Utwórz nową bazę danych „MyDB_Copy” z istniejącej bazy danych „MyDB”, korzystając z jej plików kopii zapasowej. Mamy nocne kopie zapasowe (.bak) i co 15 minut TLog (.trn). Nie chcę w żaden sposób wpływać na istniejący „MyDB”, ponieważ jest on „na żywo”.

Po utworzeniu MyDB_Copy z głównego pliku pełnej kopii zapasowej, muszę przywrócić kilkadziesiąt kopii zapasowych TLog, aby dostać się do określonego momentu.

NateJ
źródło
Czy możesz podzielić się z Tobą lub Aaronem, dlaczego to zły pomysł? lub link do problemu, w którym jest wyjaśniony?
Thronk
Wydaje mi się, że chodzi o to, że nazwy logiczne się nie zmieniają, dlatego w tym samym miejscu otrzymalibyście dwie bazy danych o różnych nazwach i plikach fizycznych, ale identycznych nazwach logicznych, co powoduje problemy w planach konserwacji, które zależą na nazwy logiczne. W mojej sytuacji te przywrócone / skopiowane bazy danych nigdy nie trwały dłużej niż kilka godzin, ale rozumiem, dlaczego nie jest to świetna praktyka.
NateJ

Odpowiedzi:

18

Opierając się luźno na przykładzie E w dokumentacji , otwórz nowe okno zapytania i uruchom:

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';
-------------------------------------------^^^^^

Nazwy logiczne nie są ważne; Fizyczne nazwy plików to. To czyni założenia dotyczące twoich logicznych nazw plików i że są tylko dwa; biegaćEXEC MyDB..sp_helpfile; aby się upewnić.

Jeśli chcesz przywrócić dzienniki, zmień RECOVERYna NORECOVERY:

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

Następnie możesz wydać serię:

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

I na ostatnim:

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

Lub jeśli potrzebujesz tylko części logowania do określonego momentu (zakładam, że sprawdziłeś, gdzie są numery LSN i czasy, więc dokładnie wiesz, które pliki potrzebujesz):

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

Sposób, w jaki mówiłeś, że działał w poprzednich wersjach, nigdy by nie działał, chyba że kopia zapasowa pochodziła z innego serwera. Domyślnie będzie próbował umieścić nowe pliki mdf i ldf w dokładnie tym samym miejscu, a to nie jest możliwe.

Aaron Bertrand
źródło
Okej, to trochę pomogło. Teraz muszę przywrócić kilkadziesiąt plików TRN, aby przywrócić DB do stanu, w którym był w piątek wieczorem (pełne kopie zapasowe zdarzają się codziennie; kopie TLog pojawiają się co 15 minut). Korzystając z twojego przykładu, utworzyłem DB z głównego pliku BAK, ale otrzymuję nowy błąd podczas próby podobnej instrukcji w celu przywrócenia dziennika. Mówi: „nie można przywrócić kopii zapasowej dziennika lub różnicowej, ponieważ żadne pliki nie są gotowe do przywrócenia”.
NateJ
@NateJ powinieneś zadać pełne pytanie. :-)
Aaron Bertrand
1
Wspaniale, piszę to teraz! Dziękuję bardzo za Twoją pomoc. Jestem zdumiony, że dostałem kilka negatywnych powtórzeń na StackOverflow, ale jeśli to zadziała, to będzie tego warte.
NateJ
1
@NateJ Powinieneś odzyskać tego przedstawiciela, ponieważ pytanie zostało usunięte podczas migracji (lub zostanie ostatecznie). To nie byłem ja, ale podejrzewam, że to z powodu twojego oskarżenia, że ​​to zadziałało w jednej wersji, ale nie teraz, kiedy jest to po prostu nieporozumienie z tym, co się dzieje ...
Aaron Bertrand
Och, mam. Coś takiego kiedyś działało - być może nie pamiętam dokładnie, co / jak, ale zgadzam się, że został źle zrozumiany. Mój kolega przeklina w górę iw dół, ale teraz, gdy o tym myślę, nie ma to sensu. Musieliśmy zrobić coś inaczej, używając GUI. Mam ochotę używać poleceń / skryptów, jak sugerowałeś, dla nas będzie lepiej. :) Dzienniki są teraz przywracane, jak dotąd z powodzeniem!
NateJ
0

Wszystko, co musisz zrobić, aby przywrócić tę samą bazę danych wiele razy, to zmienić nazwę plików dyskowych dla tej bazy danych. Oczywiście musisz nadać bazie danych inną nazwę niż jakakolwiek inna baza danych w SQL Server. W SSMS po wybraniu pliku .bak do przywrócenia i wpisaniu nazwy bazy danych, kliknij „Pliki” w sekcji „Wybierz stronę” po lewej stronie i po prostu zmień nazwę plików dyskowych.

Na zdrowie Doug

Doug
źródło