Восстановление копии одной базы Microsoft SQL Server в другую

  • Михаил
  • 5 мин. на прочтение
  • 58
  • 13 Oct 2022
  • 09 Feb 2023

Резервный набор данных содержит копию базы данных, отличной от существующей базы данных — знакомо сообщение? Восстановить Backup одной базы данных Microsoft SQL Server в другую «в лоб» приводит к сообщению об ошибке. Нередко встречаюсь с ситуациями, когда горе админы на этом и завершают свои попытки восстановления базы. Ниже приведу пример восстановления из копии одной базы в другую.
 

Диагноз

Резервный набор данных содержит копию базы данных, отличной от существующей базы данных
Была сделана копия заданием или T-SQL из базы в файл.

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

1 Сообщение 3154, уровень 16, состояние 4, строка 1
2 Резервный набор данных содержит копию базы данных, отличной от существующей базы данных "trade".
3 Сообщение 3013, уровень 16, состояние 1, строка 1
4 RESTORE DATABASE прервано с ошибкой.


Расстановка галок в разных комбинациях, как рекомендуют чудо админы на множестве форумов ни к чему не приводят.

Суть проблемы
Создавая Backup базы данных SQL Server сохраняет данные и о файлах и путях к ним, а также еще вагон служебной инфы.

При попытке восстановления в другую БД, естественно указанные ресурсы не обнаруживаются, и пользователь получает чудное сообщение, что база нужна другая.

Способ решения
При восстановлении нужно явно указать какие файлы данных куда сохранять.

В процессе восстановления, фактически создаются файлы со структурой соответствующей копии, но с другими именами и путями.

Все это подробно описано в доке для разработчиков Microsoft.

Процесс
Разберем процесс создания копии и восстановления от начала до конца. В примере будет приведен способ с T-SQL. Как аналогичное сделать с использованием пользовательского интерфейса в части восстановления – понятия не имею.

Процесс рассматриваем на примере Microsoft SQLServer 2014, но другие версии особо от него не отличаются.

Исходную базу данных будем рассматривать bgu_2021.

База данных, в которую будем грузить будет называться bgu_2021_temp.

Сам Microsoft SQL Server установлен со значениями путей по умолчанию.

Создание резервной копии базы данных Microsoft SQL Server
Создаем запрос для формирования файла резервной копии базы данных bgu_2021.

 

BACKUP DATABASE [bgu_2021] TO DISK = N'D:\1c_backup\bgu_2021\bgu_2021.bak' WITH NOFORMAT, 
INIT, NAME = N'bgu_2021-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO


Таким образом файл копии базы данных будет расположен в папке

N'D:\1c_backup\bgu_2021\bgu_2021.bak'
Получение списка файлов в файле копии
Имена файлов нам нужны для того, чтоб точно указать куда они будут сохранены при восстановлении.

Создаем и запускаем запрос

 

RESTORE FILELISTONLY FROM DISK = N'D:\1c_backup\bgu_2021\bgu_2021.bak'
GO


Получаем список

bgu_2021
bgu_2021_log

Восстановление базы данных
Предварительно создавать новую базу ненужно, т.е. в списке у вас ее не должно быть!

Создаем и запускаем запрос

 

RESTORE DATABASE [bgu_2021temp]
    FROM DISK = N'D:\1c_backup\bgu_2021\bgu_2021_backup_2022_02_07_003001_7996768.bak'
    WITH RECOVERY,
    FILE=1,
 MOVE 'bgu_2021' TO 'B:\1C-bases\bgu_2021temp\bgu_2021temp.mdf',
    MOVE 'bgu_2021_log' TO 'B:\1C-bases\bgu_2021temp\bgu_2021temp_log.ldf'
GO

С заменой.

RESTORE DATABASE [TEST_razm]
   FROM DISK = N'D:\1c_copyonly\razm\razm.bak'
WITH REPLACE, 
NOUNLOAD, 
STATS = 5,
   FILE=1,
MOVE 'razm' TO 'B:\1C-bases\TEST_razm\TEST_razm.mdf',
   MOVE 'razm_log' TO 'B:\1C-bases\TEST_razm\TEST_razm.ldf'
GO