Как восстановить в другую базу данных на сервере SQL?

224

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

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

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

Спасибо.

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

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

LocustHorde
источник

Ответы:

304

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

Просматривать содержимое;

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).
Алекс К.
источник
5
Привет, я, кажется, что-то упустил, он продолжает выдавать ошибку backkup set holds a backup of a database other than existing "tmp" database, которая, я понимаю. Должна ли toфраза быть реальным физическим путем MyTempCopy?
LocustHorde
Странно, это toместоположение базы данных и журнала для новой базы данных, пример обновления выше
Alex K.
52
Для тех, кто пытается это сделать, не создавайте MyTempCopy, он создается во время восстановления.
Blazes
3
работал только с REPLACE, RECOVERY, опциями в моем случае (SQL2012) кр. dba.stackexchange.com/questions/51489/…
dc2009
7
Следует использовать REPLACE, RECOVERY, чтобы решить это. Так что это будет: 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. Нажмите процессы. Фильтр по базе данных, которую вы хотите восстановить. Убейте все запущенные процессы, щелкнув правой кнопкой мыши по каждому процессу и выбрав «kill process».
  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: Об этом следует позаботиться, изменив базу данных Destination. Но дважды проверьте это, зайдя в Файлы и проверив имена файлов, как описано в первоначальном шаге 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 Database Engine, а затем в обозревателе объектов щелкните имя сервера, чтобы развернуть дерево серверов.
  2. Щелкните правой кнопкой мыши Базы данных , а затем нажмите Восстановить базу данных . Откроется диалоговое окно « Восстановление базы данных ».
  3. На странице Общие используйте раздел Источник, чтобы указать источник и расположение резервных наборов для восстановления. Выберите один из следующих вариантов:

    • База данных

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

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

    • устройство

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

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

  4. В разделе « Назначение » поле « База данных» автоматически заполняется именем базы данных, которую необходимо восстановить. Чтобы изменить имя базы данных, введите новое имя в поле « База данных» .
  5. В поле « Восстановить в» оставьте значение по умолчанию « До последней сохраненной резервной копии» или нажмите « Временная шкала», чтобы открыть диалоговое окно « Временная шкала резервной копии », чтобы вручную выбрать момент времени, чтобы остановить действие восстановления.
  6. В резервных наборах для восстановления сетки выберите резервные копии для восстановления. Эта сетка отображает резервные копии, доступные для указанного местоположения. По умолчанию предлагается план восстановления. Чтобы переопределить предложенный план восстановления, вы можете изменить выборки в сетке. Резервные копии, которые зависят от восстановления более ранней резервной копии, автоматически отменяются при отмене выбора более ранней резервной копии.
  7. Чтобы указать новое расположение файлов базы данных, выберите страницу « Файлы» и нажмите « Переместить все файлы в папку» . Укажите новое расположение для папки с файлами данных и папки с файлами журналов . В качестве альтернативы вы можете сохранить те же папки и просто переименовать базу данных и имена файлов журнала.
Rots
источник
3
Этот работает как шарм; отдельное спасибо за шаги 4 и 7
Анатолий Якимчук
Кроме того, мне пришлось перейти на вкладку «Параметры» и проверить «Перезаписать существующую базу данных (С ЗАМЕНАМИ)» ... Затем все заработало.
Джон Курц
1
@JohnKurtz вам не нужно делать это, если вы восстанавливаете новую базу данных.
гниет
Я уже создал пустую базу данных для восстановления в. Это должно быть разница.
Джон Курц
1
Подтвердил, что он работает, как описано, если вы введете имя несуществующей базы данных на шаге 4. Подтвердил, что если вы выбираете другую базу данных, которая уже существует, вы должны установить флажок «Перезаписать существующую базу данных (С ЗАМЕНЕ)» «на» Параметры 'Tab. Спасибо за терпеливость!
Джон Курц
34

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

Вы можете использовать ApexSQL Restore - инструмент SQL Server, который присоединяет как собственные, так и собственные сжатые резервные копии баз данных SQL и резервные копии журналов транзакций в качестве активных баз данных , доступных через SQL Server Management Studio, 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: путь к диску) в другую БД. Я попробовал этот код для модульного тестирования, но он выдает ошибку ... "Не удалось получить эксклюзивный доступ, поскольку база данных не может восстановить базу данных .. не могли бы вы помочь мне, как это сделать?
Виктор Атоти.
База данных, которую вы восстанавливаете, не может использоваться другим процессом. Я не уверен, как сценарий убивает все процессы, обращающиеся к базе данных.
Натан Нисен
Здравствуйте, 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, где вы хотите, чтобы они были на вашем новом сервере и дать ему любое имя, которое вы хотите, и вы готовы пойти.

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

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

Для 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) введите новое имя в поле «To Database». IE биллингклон

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

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

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

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

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

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

11) Нажмите обновить в вашем обозревателе объектов, и вы увидите ваш новый БД

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. восстановить это!
sedras
источник