Найти в Дзене
Wissance

MSSQL: Восстанавливаем множество бэкапов одной БД одновременно в SQL Server

Оглавление

Предыстория

Однажды у нас (wissance.com) при реализации одного из наших проектов для крупного поставщика телекоммуникационных услуг возникла задача используя бэкапы найти в БД определенные данные. В случае с бэкапами (.bak-файлы) мы выполняем в SQL Server Management Studio команду "Восстановление" (Restore) и все и получаем БД с тем именем, которое у нее было на момент бэкапа. Но тут возникает проблема: "А что если нам необходимо восстановить несколько бэкапов одновременно?" SQL Server не позволит создать несколько БД с одинаковым именем. Как быть? ведь наркотики не наш метод!

Наркотики, не наш метод!
Наркотики, не наш метод!

Немного теории

В MSSQL все БД имеют логическое имя, с которым связано 2 файла:

  • Файл данных (таблицы), который, как правило, имеет расширение .mdf
  • Файл логов (операции над данными), который, как правило имеет расширение .ldf

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

Немного практики

Для решения проблемы восстановления нескольких бэкапов на один сервер нужно сделать следующее:

1. В Management Studio выполнить следующее SQL выражение, которое выведет список файлов бэкапа:

RESTORE FILELISTSTONLY FROM DISK = 'E:\backups\mydb.bak'

Имена этих файлов понадобятся на этапе 2.

2. Далее выполним следующее SQL выражение:

RESTORE DATABASE myNewDb FROM DISK = 'E:\backups\mydb.bak'

WITH RECOVERY,

MOVE 'mydb' TO 'E:\db\data\myNewDb.mdf',

MOVE 'mydb_log' TO 'E:\db\logs\myNewDb.ldf';

Итог

База восстановлена с новым именем myNewDb. Результат достигнут. Используя данный подход можно восстановить любое количество бэкапов одной и той же БД на сервере.