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

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

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

Была сделана копия заданием или T-SQL из базы в файл.

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

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

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

Суть проблемы

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

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

Способ решения

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

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

Все это подробно описано в доке для разработчиков Microsoft, но в многобукофф не многие хотят разбираться. 😉

Процесс

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

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

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

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

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

Создание резервной копии базы данных Microsoft SQL Server

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

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

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

N'c:\Backup\Trade\trade.bak

Получение списка файлов в файле копии

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

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

RESTORE FILELISTONLY FROM DISK = N'c:\Backup\Trade\trade.bak'
GO

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

  • trade
  • trade_log

Восстановление базы данных

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

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

RESTORE DATABASE [tradenew]
     FROM DISK = N'c:\Backup\Trade\trade.bak'
     WITH RECOVERY,
     FILE=1,
     MOVE 'trade' TO 'C:\Program Files\Microsoft SQL Server\MSSQL \MSSQL\DATA\tradenew.mdf',
     MOVE 'trade_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL \MSSQL\DATA\tradenew_log.ldf'
GO

Жмем кнопку выполнить и ожидаем.

По завершении наслаждаемся готовым результатом.

Ссылки на страницы документации по теме

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

  1. Спасибо тебе, добрый человек! Блин, как же всё-таки у микрософта всё через жопу . Нет бы как у людей, в одну строчку:
    mysql -u root -p **** base < backup.sql

  2. Если вы хотите создавать бэкапы журналов транзакций для всех баз, за исключением одной или нескольких определенных, то для этих баз-исключений нужно указать модель восстановления simple .

  3. Если вы хотите создавать бэкапы журналов транзакций для всех баз, за исключением одной или нескольких определенных, то для этих баз-исключений нужно указать модель восстановления simple .

    1. Тут рассматривается конкретный случай формирования бэкапа.

      Если говорить «по-уму», то бэкапы вообще лучше делать в рамках планов обслуживания, а не «колхозить» скриптами.

      Эта ситуация встречается на предприятиях, где сидят админы далёкие от работы с 1С в частности и современными инструментами управления Microsoft SQL Server вообще.

Комментарии запрещены.