SQL Server 2012 Відновлення резервної копії до нового Імені БД


16

Здається, я пам’ятаю, що в 2008 році ви могли відновити резервну копію в новій копії БД, змінивши ім'я в полі «База даних призначення» з майстра відновлення. Це створило б абсолютно нову БД, яка є копією оригінальної БД, відновленої до потрібного часу. Я все життя не придумав, як змусити SQL 2012 робити це.

Тепер я розумію (завдяки Аарону Бертранду), що це насправді не змінилося, і що 2012 рік фактично робить для мене більш очевидним, що ця стратегія в першу чергу була поганою ідеєю!

Отже, що мені потрібно зробити: це створити новий БД "MyDB_Copy" з існуючої БД "MyDB", використовуючи його резервні файли. У нас є щоденні резервні копії (.bak) та кожні 15 хвилин TLogs (.trn). Я не хочу, щоб на існуючий "MyDB" взагалі впливали / торкалися, тому що це "наживо".

Після того, як MyDB_Copy створений з основного файлу повного резервного копіювання, мені потрібно відновити кілька десятків резервних копій TLog, щоб довести його до певного моменту часу.


Чи можете ви або Аарон поділитися, чому це погана ідея? або посилання на питання, де це пояснено?
Thronk

Я вважаю, що це щось про те, що логічні імена не змінюються, і, таким чином, ви отримаєте два БД у тому самому місці, які мають різні імена та фізичні файли, але однакові логічні імена, що спричиняє проблеми для планів обслуговування, які залежать на логічні-імена. У моїй ситуації відновлені / скопійовані БД ніколи не тривали більше кількох годин, але я можу зрозуміти, чому це не чудова практика.
NateJ

Відповіді:


18

Грунтуючись на прикладі E в документації , відкрийте нове вікно запитів і запустіть:

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

Логічні назви не важливі; імена фізичних файлів є. Це робить припущення про назви ваших логічних файлів і про те, що їх є лише два; біжи, EXEC MyDB..sp_helpfile;щоб бути впевненим.

Якщо вам потрібно відновити журнали, змініть RECOVERYна NORECOVERY:

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

Тоді ви можете оформити серію:

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

І на самому останньому:

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

Або якщо вам потрібна лише частина журналу до моменту часу (я припускаю, ви перевірили, де знаходяться LSN та час, щоб ви точно знали, які файли вам потрібні):

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

Те, як ви сказали, що працювало в попередніх версіях, ніколи б не працювало, якби резервна копія не надходила з іншого сервера. За замовчуванням він спробує помістити нові файли mdf та ldf в точно те саме місце, а це неможливо.


Гаразд, це мало допомогло. Тепер мені потрібно відновити кілька десятків файлів TRN, щоб повернути БД до стану, в який це було в ніч на п’ятницю (повні резервні копії відбуваються щодня; резервні копії TLog трапляються кожні 15 хвилин). Використовуючи ваш зразок, я отримав БД, створений з основного файлу BAK, але я отримую нову помилку при спробі подібного оператора відновити журнал. У ньому йдеться про те, що "журнал або диференціальне резервне копіювання не можна відновити, оскільки жоден файл не готовий до прокрутки".
NateJ

@NateJ тоді вам слід задати повне запитання. :-)
Аарон Бертран

1
Дивовижно, я зараз це набираю! Дуже дякую за вашу допомогу. Я зіткнувся з тим, що у StackOverflow я отримав декілька негативних представників, але якщо це спрацює, воно того варто.
NateJ

1
@NateJ Ви повинні повернути цю відповідь, тому що питання було видалено, коли воно було перенесено (або буде врешті-решт). Це не я, але я підозрюю, що це було через ваше звинувачення, що це працювало в одній версії, але не зараз, коли це явно просто непорозуміння того, що відбувалося ...
Аарон Бертран

Ой, я. Щось подібне раніше працювало - я, можливо, не пам’ятаю, що саме / як, але я згоден, що це було неправильно зрозуміло. Мій колега клянеться вгору-вниз, але тепер, коли я думаю про це, це не має сенсу. Ми, мабуть, зробили щось інакше, використовуючи графічний інтерфейс. Я відчуваю, що використання команд / сценаріїв, як ви запропонували, стане кращим для нас. :) Журнали відновлюються зараз, успішно поки що!
NateJ

0

Все, що вам потрібно зробити, щоб відновити одну і ту ж базу даних кілька разів - це змінити назву файлів дисків для цієї бази даних. Очевидно, що потрібно надати базі даних інше ім’я будь-якій іншій базі даних на SQL Server. У SSMS після вибору .bak-файлу для відновлення та введення імені для бази даних, ви натискаєте "Файли" у розділі "Вибрати сторінку" зліва та просто змінюєте ім'я файлів диска.

Ура Дуг

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.