Как восстановить базу данных в SQL Server?

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

Я видел этот вопрос: Восстановить базу данных SQL Server на том же компьютере с другим именем, и рекомендуемым шагом является переименование исходного db, но я из этого как я нахожусь на рабочем сервере, и я не могу этого сделать.

Есть ли другой способ восстановить его на Database2 или, по крайней мере, как я просматриваю данные этого .bak файла?

спасибо.

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

Восстановить список файлов заканчивается ненормально

Ответ 1

Вы можете создать новый 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, называемой "кредитная линия", на "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).

Ответ 2

SQL Server 2008 R2:

Для существующей базы данных, которую вы хотите "восстановить: из резервной копии другой базы данных, выполните следующие действия:

  1. На панели инструментов нажмите кнопку "Монитор активности".
  2. Нажмите процессы. Фильтр по базе данных, которую вы хотите восстановить. Убейте все запущенные процессы, щелкнув правой кнопкой мыши по каждому процессу и выбрав "kill process".
  3. Щелкните правой кнопкой мыши базу данных, которую вы хотите восстановить, и выберите Tasks--> Восстановить → Из базы данных.
  4. Выберите переключатель "С устройства:".
  5. Выберите... и выберите файл резервной копии другой базы данных, из которой вы хотите восстановить.
  6. Выберите набор резервных копий, из которого вы хотите восстановить, установив флажок слева от набора резервных копий.
  7. Выберите "Параметры".
  8. Выберите Перезаписать существующую базу данных (С ЗАМЕНОЙ)
  9. Важно: Измените имя файла данных "Восстановить как" на имя файла существующей базы данных, которую вы хотите перезаписать, или просто дайте ему новое имя.
  10. Сделайте то же самое с именем файла журнала.
  11. На экране монитора активности убедитесь, что не было запущено ни одного нового процесса. Если они были, убейте их.
  12. Нажмите ОК.

Ответ 3

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

Примечание шаги 4 и 7 важны для установки, чтобы не перезаписывать существующую базу данных.


Чтобы восстановить базу данных в новое место и, возможно, переименуйте базу данных

  • Подключитесь к соответствующему экземпляру SQL Server Database Engine, а затем в Обозревателе объектов щелкните имя сервера, чтобы развернуть дерево сервера.
  • Щелкните правой кнопкой мыши Базы данных и выберите Восстановить базу данных. Откроется диалоговое окно Восстановить базу данных.
  • На странице Общие используйте раздел Источник, чтобы указать источник и расположение восстанавливаемых наборов резервных копий. Выберите один из следующие параметры:

    • База данных

      • Выберите базу данных для восстановления из раскрывающегося списка. Список содержит только базы данных, которые были скопированы в соответствии с msdb история резервного копирования.

        Примечание Если резервная копия взята с другого сервера, на целевом сервере не будет информации о предыстории архива для указанной базы данных. В этом случае выберите "Устройство" вручную укажите файл или устройство для восстановления.

    • Устройство

      • Нажмите кнопку обзора (...), чтобы открыть диалоговое окно Выбрать резервные устройства. В поле Тип носителя резервного копирования выберите один из перечисленных типов устройств. Чтобы выбрать одно или несколько устройств для Резервное копирование, нажмите Добавить. После добавления устройств, которые требуется в список Резервный носитель, нажмите ОК, чтобы вернуться к Общая страница. В списке Источник: Устройство: База данных выберите имя базы данных, которая должна быть восстановлена.

        Примечание Этот список доступен только при выборе устройства. Только базы данных с резервными копиями на выбранном устройстве будут быть доступным.

  • В разделе Назначение поле База данных автоматически заполняется именем восстанавливаемой базы данных. Чтобы изменить имя базы данных, введите новое имя в База данных.
  • В поле Восстановить до оставьте значение по умолчанию Для последней сделанной резервной копии или нажмите Временная шкала, чтобы получить доступ к Резервное копирование Timeline, чтобы вручную выбрать точку во времени, чтобы остановить восстановление.
  • В сетях Резервное копирование для восстановления выберите резервные копии для восстановления. Эта сетка отображает резервные копии, доступные для указанного место нахождения. По умолчанию предлагается план восстановления. Чтобы переопределить предлагаемый план восстановления, вы можете изменить выбор в сетке. Резервные копии, зависящие от восстановления более ранней резервной копии, автоматически отменяется, если предыдущая резервная копия отменена.
  • Чтобы указать новое местоположение файлов базы данных, выберите страницу Файлы, а затем нажмите Переместить все файлы в папку. Укажите новое место для папки Файл данных и Лог файл папку. Кроме того, вы можете хранить одни и те же папки и просто переименовывать имена файлов базы данных и журналов.

Ответ 4

На самом деле нет необходимости восстанавливать базу данных на основе родных терминов SQL Server, так как вы "хотите возиться с некоторыми данными" и "просматриваете данные этого .bak файла"

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

Кроме того, я считаю, что вы можете выполнить эту работу, пока инструмент находится в полностью функциональном пробном режиме (14 дней)

Отказ от ответственности: я работаю инженером по поддержке продуктов на ApexSQL

Ответ 5

Вот то, что я собрал из разных сообщений, чтобы скопировать базу данных с помощью резервного копирования и восстановления, переместив ее, чтобы исправить физическое местоположение и дополнительный 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);

Ответ 6

На самом деле это немного проще, чем восстановление на том же сервере. В основном, вы просто просматриваете опции "Восстановить базу данных". Вот вам учебник:

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

Тем более, что это непроизводственное восстановление, вы можете чувствовать себя комфортно, просто проверяя его, не беспокоясь о деталях слишком много. Просто поместите свои SQL файлы туда, где вы хотите их на свой новый сервер, и дайте им любое имя, которое вам нужно, и вам будет хорошо.

Ответ 7

Если база данных не существует, я использую следующий код:

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 [email protected]     
            WITH 
               MOVE @databaseLogicName TO @restoreDatabaseFilePath,
               MOVE @logLogicName TO @restoreLogFilePath

            SET NOCOUNT OFF
    END

Ответ 8

  • У меня та же ошибка, что и в этой теме, когда я восстанавливаю новую базу данных, используя старую базу данных. (использование .bak приводит к той же ошибке)

  • Я изменил имя старой базы данных на имя новой базы данных (то же самое на этом рисунке). Это сработало.

enter image description here

Ответ 9

Вот как восстановить резервную копию как дополнительный 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) Далее, в Management Studio, rt нажмите "Базы данных в обозревателе объектов", выберите "Восстановить базу данных"

4) введите новое имя в поле "В базу данных". И.Е. billingclone

5) В "Источник восстановления" нажмите "От устройства" и нажмите кнопку "...".

6) Нажмите "Добавить" и перейдите к резервной копии

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

8) затем выберите страницу OPTIONS в верхнем углу LH

9) Теперь отредактируйте имена файлов базы данных в RESTORE AS. Сделайте это как для db, так и для журнала. И.Е. billingclone.mdf и billingclone_log.ldf

10) теперь нажмите ОК и дождитесь завершения задачи.

11) Обновите обновление в своем обозревателе объектов, и вы увидите новый db

12) Теперь вы можете вернуть свой биллинг db в онлайн. Используйте одно и то же окно запросов, которое вы использовали для отключения биллинга. Используйте эту команду:

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

сделано!