Як відновити іншу базу даних на сервері sql?


224

У мене є резервна копія Database1 від тижня тому. Резервне копіювання робиться щотижня в планувальнику, і я отримую .bakфайл. Тепер я хочу поспілкуватися з деякими даними, тому мені потрібно відновити його в іншій базі даних - Database2 .

Я бачив це питання: Відновити базу даних SQL Server на одному ПК з різною назвою, і рекомендованим кроком є ​​перейменування оригінального db, але я вийшов із цього варіанту, оскільки перебуваю на виробничому сервері, і я не можу це дійсно робити.

Чи є якийсь інший спосіб відновити його до Database2або якнайменше, як я переглядаю дані цього файлу .bak?

Дякую.

ps: друга відповідь із наведеного вище посилання виглядала багатообіцяючою, але вона продовжує закінчуватися помилкою:

Відновити список файлів закінчується аномально

Відповіді:


304

Ви можете створити новий db, а потім скористатись "Майстром відновлення", увімкнувши опцію Overwrite або;

Переглянути вміст;

RESTORE FILELISTONLY FROM DISK='c:\your.bak'

відзначте логічні назви .mdf & .ldf з результатів, потім;

RESTORE DATABASE MyTempCopy FROM DISK='c:\your.bak'
WITH 
   MOVE 'LogicalNameForTheMDF' TO 'c:\MyTempCopy.mdf',
   MOVE 'LogicalNameForTheLDF' TO 'c:\MyTempCopy_log.ldf'

Для створення бази даних MyTempCopyіз вмістом your.bak.

Приклад (відновлює резервну копію db під назвою "Creditline" на "MyTempCopy";

RESTORE FILELISTONLY FROM DISK='e:\mssql\backup\creditline.bak'

>LogicalName
>--------------
>CreditLine
>CreditLine_log

RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak'
WITH 
   MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf',
   MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'

>RESTORE DATABASE successfully processed 186 pages in 0.010 seconds (144.970 MB/sec).

5
Привіт, я, здається, чогось не вистачає, він продовжує кидати помилку backkup set holds a backup of a database other than existing "tmp" database, яка, я розумію. Чи повинна ця toфраза бути фактичним фізичним шляхом MyTempCopy?
LocustHorde

Незвичайно, toмісце розташування db & log для нової бази даних, приклад оновлення вище
Alex K.

52
Для інших, хто це намагається, не створюйте MyTempCopy, він створюється під час відновлення.
Блейз

3
працював лише з ЗАМОВЛЕННЯМИ, ВІДНОВЛЕННЯ, опціями у моєму випадку (SQL2012) dba.stackexchange.com/questions/51489/…
dc2009

7
Якщо для цього слід використати ЗАМОВЛЕННЯ, ВІДНОВЛЕННЯ. Отже, це було б: RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak' WITH REPLACE, RECOVERY, MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf', MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'
Райхан

67

SQL Server 2008 R2:

Для існуючої бази даних, яку ви хочете "відновити: з резервної копії іншої бази даних виконайте наступні дії:

  1. На панелі інструментів натисніть кнопку Монітор активності.
  2. Клацніть процеси. Фільтр по базі даних, яку ви хочете відновити. Вбийте всі запущені процеси, клацнувши правою кнопкою миші на кожному процесі та вибравши "вбити процес".
  3. Клацніть правою кнопкою миші на базі даних, яку ви хочете відновити, і виберіть Завдання -> Відновити -> З бази даних.
  4. Виберіть перемикач "З пристрою:".
  5. Виберіть ... і виберіть файл резервної копії іншої бази даних, з якої ви хочете відновити.
  6. Установіть набір резервних копій, який ви хочете відновити, встановивши прапорець зліва від набору резервних копій.
  7. Виберіть "Параметри".
  8. Виберіть Перезаписати наявну базу даних (З ЗАМІНЮ)
  9. Важливо: Змініть ім'я файла рядків "Відновити як" на ім'я файлу існуючої бази даних, яке ви хочете перезаписати, або просто дайте йому нове ім'я.
  10. Зробіть те ж саме з назвою файла файлу журналу.
  11. Переконайтеся на екрані монітора активності, що не було породжено нових процесів. Якби вони були, вбийте їх.
  12. Натисніть кнопку ОК.

12
MS SQL Server 2010?
Марк

3
Тут є кілька скріншотів stackoverflow.com/questions/3829271/…
Томаш Кубес

Незважаючи на те, що я програміст, я скоріше використовую цей майстер. Легше і чистіше.
v1n1akabozo

1
Ключовим кроком для мене був №8. Дякую, Даніеле.
jbooker

Sql 2014 .. Крок 6a: Змініть базу даних пункту призначення на базу даних, до якої ви хочете відновити. Крок 9 і 10: про це слід подбати, змінивши базу даних призначення. Але двічі перевірте це, перейшовши до Файлів і перевіривши назви файлів, як описано в початковому кроці 9 і 10.
JzInqXc9Dg

49

Для SQL Server 2012, використовуючи Sql Server Management Studio, я знайшов ці кроки зі сторінки Microsoft корисними для відновлення до іншого файлу бази даних та імені: (посилання: http://technet.microsoft.com/en-us/library/ms175510 .aspx )

Зауважте, що кроки 4 та 7 важливо встановити так, щоб не перезаписати існуючу базу даних.


Щоб відновити базу даних на нове місце та необов'язково перейменувати базу даних

  1. Підключіться до відповідного примірника двигуна баз даних SQL Server, а потім у Провіднику об’єктів натисніть ім'я сервера, щоб розгорнути дерево сервера.
  2. Клацніть правою кнопкою миші Бази даних та натисніть Відновити базу даних . Відкриється діалогове вікно Відновлення бази даних .
  3. На сторінці Загальні використовуйте розділ Джерело, щоб вказати джерело та місце розташування резервних наборів для відновлення. Виберіть один із наступних варіантів:

    • База даних

      • Виберіть базу даних для відновлення зі спадного списку. Список містить лише бази даних, які були резервні копії відповідно до історії резервного копіювання msdb .

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

    • Пристрій

      • Натисніть кнопку перегляду (...), щоб відкрити діалогове вікно Вибрати пристрої резервного копіювання . У полі Тип носія для резервного копіювання виберіть один із перелічених типів пристроїв. Щоб вибрати один або кілька пристроїв для вікна резервного копіювання медіа , натисніть кнопку Додати . Після того як ви додасте потрібні пристрої до списку резервного копіювання медіа , натисніть кнопку ОК, щоб повернутися на сторінку Загальні . У полі Джерело: Пристрій: у полі списку баз даних виберіть ім'я бази даних, яку слід відновити.

        Примітка Цей список доступний лише тоді, коли вибрано Пристрій. Будуть доступні лише бази даних, які мають резервні копії на вибраному пристрої.

  4. У розділі " Призначення " вікно " База даних " автоматично заповнюється ім'ям бази даних, яку потрібно відновити. Щоб змінити ім'я бази даних, введіть нове ім'я у поле База даних .
  5. У полі « Відновити до» залиште за замовчуванням як До останнього зробленого резервного копіювання, або натисніть « Шкала», щоб отримати доступ до діалогового вікна « Резервне копіювання» , щоб вручну вибрати момент часу, щоб зупинити дію відновлення.
  6. У Наборах резервного копіювання для відновлення сітки виберіть резервні копії для відновлення. Ця сітка відображає резервні копії, доступні для вказаного місця. За замовчуванням пропонується план відновлення. Щоб замінити запропонований план відновлення, ви можете змінити виділення в сітці. Резервні копії, які залежать від відновлення попередньої резервної копії, автоматично відміняються, коли знімається попередня резервна копія.
  7. Щоб визначити нове розташування файлів бази даних, виберіть сторінку « Файли» та натисніть « Перемістити всі файли у папку» . Укажіть нове місце для папки Файл даних та Папка файлів журналу . Крім того, ви можете зберігати однакові папки та просто перейменовувати імена файлів бази даних та журналів.

3
Цей працює як шарм; особлива подяка за кроки 4 та 7
Анатолій Якимчук,

Додатково мені довелося перейти на вкладку "Параметри" і перевірити "Перезаписати існуючу базу даних (З ЗАМІНЬОЮ") ... Потім це спрацювало.
Джон Курц

1
@JohnKurtz вам не потрібно робити цього, якщо ви відновите нову базу даних.
Rots

Я вже створив порожню базу даних для відновлення. У цьому повинна бути різниця.
Джон Курц

1
Підтверджено, що вона працює так, як описано, якщо ви вкажете ім'я неіснуючої бази даних на кроці 4. Підтверджено, що якщо ви виберете іншу базу даних, яка вже існує, вам потрібно встановити прапорець "Перезаписати існуючу базу даних (ЗАМОВЛЕННЯ)" на " Вкладка "Параметри". Дякую за Ваше терпіння!
Джон Курц

34

Насправді, не потрібно відновлювати базу даних у власних термінах SQL Server, оскільки ви «хочете поспілкуватися з деякими даними» та «переглядати дані цього .bak-файлу»

Ви можете використовувати відновлення ApexSQL - інструмент SQL Server, який приєднує резервні копії баз даних SQL та натиснутої на нього природні та природні резервні копії як живі бази даних , доступні через студію управління SQL Server, Visual Studio або будь-який інший сторонній інструмент. Це дозволяє приєднувати єдине чи кілька повних, диференціальних та резервних копій журналу транзакцій

Більше того, я думаю, що ви можете виконати цю роботу, поки інструмент знаходиться у повністю функціональному пробному режимі (14 днів)

Відмова: Я працюю інженером з підтримки продуктів у ApexSQL


9

Ось що я спільно з різних публікацій скопіював базу даних за допомогою резервного копіювання та відновлення з переміщенням, щоб виправити фізичне розташування та додатковий sql, щоб виправити логічне ім'я.

/**
 * Creates (or resets) a Database to a copy of the template database using backup and restore.
 *
 * Usage: Update the @NewDatabase value to the database name to create or reset.
 */

DECLARE @NewDatabase SYSNAME = 'new_db';

-- Set up
USE tempdb;

DECLARE @TemplateBackups SYSNAME = 'TemplateBackups';
DECLARE @TemplateDatabase SYSNAME = 'template_db';
DECLARE @TemplateDatabaseLog SYSNAME = @TemplateDatabase + '_log';

-- Create a backup of the template database
BACKUP DATABASE @TemplateDatabase TO DISK = @TemplateBackups WITH CHECKSUM, COPY_ONLY, FORMAT, INIT, STATS = 100;

-- Get the backup file list as a table variable
DECLARE @BackupFiles TABLE(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileId tinyint,CreateLSN numeric(25,0),DropLSN numeric(25, 0),UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0),ReadWriteLSN numeric(25,0),BackupSizeInBytes bigint,SourceBlockSize int,FileGroupId int,LogGroupGUID uniqueidentifier,DifferentialBaseLSN numeric(25,0),DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit,TDEThumbprint varbinary(32));
INSERT @BackupFiles EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @TemplateBackups + '''');

-- Create  the backup file list as a table variable
DECLARE @NewDatabaseData VARCHAR(MAX);
DECLARE @NewDatabaseLog VARCHAR(MAX);

SELECT @NewDatabaseData = PhysicalName FROM @BackupFiles WHERE Type = 'D';
SELECT @NewDatabaseLog = PhysicalName FROM @BackupFiles WHERE Type = 'L';

SET @NewDatabaseData = REPLACE(@NewDatabaseData, @TemplateDatabase, @NewDatabase);
SET @NewDatabaseLog = REPLACE(@NewDatabaseLog, @TemplateDatabase, @NewDatabase);

RESTORE DATABASE @NewDatabase FROM DISK = @TemplateBackups WITH CHECKSUM, RECOVERY, REPLACE, STATS = 100,
   MOVE @TemplateDatabase TO @NewDatabaseData,
   MOVE @TemplateDatabaseLog TO @NewDatabaseLog;

-- Change Logical File Name
DECLARE @SQL_SCRIPT VARCHAR(MAX)='
    ALTER DATABASE [{NewDatabase}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}'', NEWNAME=N''{NewDatabase}'');
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}_log'', NEWNAME=N''{NewDatabase}_log'');
    ALTER DATABASE [{NewDatabase}] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
    SELECT name AS logical_name, physical_name FROM SYS.MASTER_FILES WHERE database_id = DB_ID(N''{NewDatabase}'');
';
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TemplateDatabase}', @TemplateDatabase);
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{NewDatabase}', @NewDatabase);
EXECUTE (@SQL_SCRIPT);

Привіт NateN, я хочу відновити мій файл .bak (який існує в моїй локальній машині d: шлях диска) до іншого БД. "не вдається відновити db ... чи можете ви мені допомогти, як це зробити?"
Віктор Атоті.

База даних, яку ви відновлюєте, не може бути використана іншим процесом. Я не впевнений, як скрипт вбити всі процеси, що мають доступ до бази даних.
Натан Нісен

Здравствуйте, NateN, це працює нормально, я використовую ваш зразок коду, а потім я вніс невеликі зміни в цей код, а потім працював нормально .... Ще раз дякую за
наданий

1
Для sql2014 і пізніше для DECLARE @BackupFiles...рядка потрібен додатковий стовпець:SnapshotURL nvarchar(360)
фіат

3

Це насправді трохи простіше, ніж відновити на одному сервері. В основному, ви просто проходите параметри "Відновити базу даних". Ось підручник для вас:

http://www.techrepublic.com/blog/window-on-windows/how-do-i-restore-a-sql-server-database-to-a-new-server/454

Тим більше, що це непроизводственное відновлення, ви можете почувати себе комфортно, просто спробувавши його, не переживаючи над деталями. Просто поставте свої файли SQL там, де ви хочете, їх на своєму новому сервері і дайте йому будь-яке ім’я, і ви хочете піти.


Привіт, мені потрібно відновити той самий сервер, іншу базу даних ... (db для відновлення має іншу назву)
LocustHorde

Вибачте, я неправильно прочитав питання. Застосовуються ті самі основні принципи, просто потрібно переконатися, що нові імена та назви файлів (mdf, ldf тощо) відрізняються.
IAmTimCorey

3

Якщо немає бази даних, я використовую такий код:

ALTER PROCEDURE [dbo].[RestoreBackupToNewDB]    
         @pathToBackup  varchar(500),--where to take backup from
         @pathToRestoreFolder  varchar(500), -- where to put the restored db files 
         @newDBName varchar(100)
    AS
    BEGIN

            SET NOCOUNT ON
            DECLARE @fileListTable TABLE (
            [LogicalName]           NVARCHAR(128),
            [PhysicalName]          NVARCHAR(260),
            [Type]                  CHAR(1),
            [FileGroupName]         NVARCHAR(128),
            [Size]                  NUMERIC(20,0),
            [MaxSize]               NUMERIC(20,0),
            [FileID]                BIGINT,
            [CreateLSN]             NUMERIC(25,0),
            [DropLSN]               NUMERIC(25,0),
            [UniqueID]              UNIQUEIDENTIFIER,
            [ReadOnlyLSN]           NUMERIC(25,0),
            [ReadWriteLSN]          NUMERIC(25,0),
            [BackupSizeInBytes]     BIGINT,
            [SourceBlockSize]       INT,
            [FileGroupID]           INT,
            [LogGroupGUID]          UNIQUEIDENTIFIER,
            [DifferentialBaseLSN]   NUMERIC(25,0),
            [DifferentialBaseGUID]  UNIQUEIDENTIFIER,
            [IsReadOnly]            BIT,
            [IsPresent]             BIT,
            [TDEThumbprint]         VARBINARY(32) -- remove this column if using SQL 2005
            )
            INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK ='''+ @pathToBackup+'''')
            DECLARE @restoreDatabaseFilePath NVARCHAR(500)
            DECLARE @restoreLogFilePath NVARCHAR(500)
            DECLARE @databaseLogicName NVARCHAR(500)
            DECLARE @logLogicName NVARCHAR(500)
            DECLARE @pathSalt uniqueidentifier = NEWID()

            SET @databaseLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='D') 
            SET @logLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='L')           
            SET @restoreDatabaseFilePath= @pathToRestoreFolder + @databaseLogicName + convert(nvarchar(50), @pathSalt) + '.mdf'
            SET @restoreLogFilePath= @pathToRestoreFolder + @logLogicName + convert(nvarchar(50), @pathSalt) + '.ldf'

            RESTORE DATABASE @newDBName FROM DISK=@pathToBackup     
            WITH 
               MOVE @databaseLogicName TO @restoreDatabaseFilePath,
               MOVE @logLogicName TO @restoreLogFilePath

            SET NOCOUNT OFF
    END

3
  • У мене така ж помилка, як у цій темі, коли я відновлюю нову базу даних за допомогою старої бази даних. (використання .bak видає ту ж помилку)

  • Я змінив ім'я старої бази даних на ім'я нової бази даних (така ж картинка). Це спрацювало.

введіть тут опис зображення


2
Наступного разу видаліть назву банку
Danh

1

Ось як відновити резервну копію як додатковий db з унікальним іменем db.

Для SQL 2005 це працює дуже швидко. Я впевнений, що новіші версії працюватимуть так само.

По-перше, вам не доведеться брати оригінальний db в автономному режимі. Але заради безпеки я люблю це. У своєму прикладі я збираюся встановити клон моєї бази даних "білінг", і він буде названий "billingclone".

1) Зробіть гарне резервне копіювання бази даних рахунків

2) Для безпеки я взяв оригінал офлайн так:

3) Відкрийте нове вікно запитів

** ВАЖЛИВО! Тримайте це вікно запиту відкритим, поки ви все не закінчите! Вам потрібно відновити db з цього вікна!

Тепер введіть наступний код:

-- 1) free up all USER databases
USE master;
GO
-- 2) kick all other users out:
ALTER DATABASE billing SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3) prevent sessions from re-establishing connection:
ALTER DATABASE billing SET OFFLINE;

3) Далі, в студії управління, натисніть rt, натисніть "Бази даних" в "Провідник об'єктів", виберіть "Відновити базу даних"

4) введіть нове ім’я в поле "До бази даних". IE білінглон

5) У Джерелі для відновлення натисніть "З пристрою" та натисніть кнопку ... переміщення

6) Клацніть Додати та перейдіть до резервної копії

7) Поставте галочку біля пункту Відновити (Виберіть набір резервних копій для відновлення)

8) Далі виберіть сторінку ВАРІАНТИ у верхньому куті LH

9) Тепер відредагуйте назви файлів бази даних в RESTORE AS. Зробіть це як для db, так і для журналу. IE billingclone.mdf та billingclone_log.ldf

10) тепер натисніть кнопку ОК і чекайте завершення завдання.

11) Натисніть оновити у своєму Провіднику об’єктів, і ви побачите ваш новий db

12) Тепер ви можете розмістити свій платіжний банк назад в Інтернеті. Скористайтеся тим самим вікном запиту, який ви використовували для здійснення платежів в режимі офлайн. Використовуйте цю команду:

-- 1) free up all USER databases
USE master; GO
-- 2) restore access to all users:
ALTER DATABASE billing SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO
-- 3) put the db back online:
ALTER DATABASE billing SET ONLINE;

зроблено!


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