Предыстория
Однажды у нас (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. Результат достигнут. Используя данный подход можно восстановить любое количество бэкапов одной и той же БД на сервере.