Как восстановить в другую базу данных на сервере SQL? - PullRequest
206 голосов
/ 07 июня 2011

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

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

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

спасибо.

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

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

Ответы [ 9 ]

284 голосов
/ 07 июня 2011

Вы можете создать новую базу данных, а затем использовать «Мастер восстановления», включающий параметр «Перезаписать», или;

Просмотр содержимого;

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.

Пример (восстанавливает резервную копию базы данных с именем 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).
64 голосов
/ 10 декабря 2012

SQL Server 2008 R2:

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

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

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

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


Для восстановления базы данных в новуюрасположение и при необходимости переименуйте базу данных

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

    • База данных

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

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

    • Устройство

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

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

  4. В разделе Пункт назначения раздел *Поле 1093 * Database автоматически заполняется именем базы данных, подлежащей восстановлению.Чтобы изменить имя базы данных, введите новое имя в поле База данных .
  5. В поле Восстановить до оставьте значение по умолчанию как .последнее выполненное резервное копирование или нажмите Временная шкала , чтобы открыть диалоговое окно Резервная временная шкала , чтобы вручную выбрать момент времени, чтобы остановить действие восстановления.
  6. В резервных наборах для восстановления сетки выберите резервные копии для восстановления.Эта сетка отображает резервные копии, доступные для указанного местоположения.По умолчанию предлагается план восстановления.Чтобы переопределить предложенный план восстановления, вы можете изменить выборки в сетке.Резервные копии, которые зависят от восстановления более ранней резервной копии, автоматически отменяются при отмене выбора более ранней резервной копии.
  7. Чтобы указать новое расположение файлов базы данных, выберите страницу Files и нажмите кнопку Переместить все файлы в папку .Укажите новое местоположение для папки с файлами данных и папки с файлами журнала .Кроме того, вы можете сохранить те же папки и просто переименовать базу данных и имена файлов журнала.
34 голосов
/ 24 января 2014

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

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

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

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

7 голосов
/ 07 мая 2015

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

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

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

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

2 голосов
/ 02 февраля 2017

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

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
1 голос
/ 24 января 2017

Вот как восстановить резервную копию в виде дополнительной базы данных с уникальным именем базы данных.

Для SQL 2005 это работает очень быстро.Я уверен, что новые версии будут работать так же.

Во-первых, вам не нужно переводить исходную базу данных в автономный режим.Но ради безопасности мне нравится.В моем примере я собираюсь смонтировать клон моей «биллинговой» базы данных, и он будет называться «billingclone».

1) Сделать хорошую резервную копию биллинговой базы данных

2)В целях безопасности я отключил оригинал следующим образом:

3) Откройте новое окно запроса

** ВАЖНО!Держите это окно запроса открытым, пока вы все не сделали!Вам необходимо восстановить базу данных из этого окна!

Теперь введите следующий код:

-- 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, нажмите «Базы данных» в «Обозревателе объектов», выберите «Восстановить базу данных»."

4) введите новое имя в поле" К базе данных ".IE billingclone

5) В «Source for Restore» нажмите «С устройства» и нажмите ... кнопку навигации

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

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

8) затем выберите страницу ОПЦИИ в верхнем левом углу

9) Теперь измените имена файлов базы данных в RESTORE AS.Сделайте это для базы данных и журнала.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 голос
/ 20 декабря 2016
  • У меня та же ошибка, что и в этом разделе при восстановлении новой базы данных с использованием старой базы данных.(использование .bak дает ту же ошибку)

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

enter image description here

...