Невозможно восстановить базу данных в моментальный снимок в SQL Server
Я хочу создать моментальный снимок базы данных и восстанавливать его при каждом запуске модульного теста. Я могу создать снимок, но, восстанавливая его, я сталкиваюсь с ошибкой ниже, делая это.
Сообщение 5070, Уровень 16, Состояние 2, Строка 1
Состояние базы данных не может быть изменено, пока другие пользователи используют базу данных "ImportData"Сообщение 3013, уровень 16, состояние 1, строка 1
ВОССТАНОВЛЕНИЕ БАЗЫ ДАННЫХ завершается ненормально.
Запросы SQL для создания и возврата базы данных к снимку перечислены ниже.
Создать снимок:
CREATE DATABASE Data_SShot
ON (NAME=Data,
FILENAME='C:\Snapshot\DataSnapshot.ss'),
(NAME=Data_Data1,
FILENAME='C:\Snapshot\Data1Snapshot.ss'),
(NAME=Data_Index1,
FILENAME='C:\Snapshot\DataIndexSnapshot.ss')
AS SNAPSHOT OF Data
Восстановить в моментальный снимок
use master
go
RESTORE DATABASE Data
FROM DATABASE_SNAPSHOT = 'Data_SShot'
Это заявляет, что
Состояние базы данных не может быть изменено, пока другие пользователи используют базу данных
Как преодолеть эту проблему? Я использую.NET (C#), чтобы сделать это. Как закрыть соединение для запуска RESTORE DATABASE
успешно?
Я хочу, чтобы весь этот процесс создания снимка и последующего возврата к нему БД происходил для каждого теста в наборе тестов.
2 ответа
Есть несколько вещей, которые необходимо сделать перед восстановлением БД.
- Получить количество активных пользователей для БД и убить сеансы.
- Переведите БД в автономный режим и онлайн, что приведет к прекращению всех скрытых подключений.
- Теперь восстановите БД. Если это не удается, переведите БД в автономный режим и попробуйте восстановить.
- После восстановления переведите БД в оперативный режим.
Это шаги, которые я использую для восстановления БД, и это работало для меня в течение длительного времени.
Сделайте следующее:
ALTER DATABASE [Data] SET SINGLE_USER
RESTORE DATABASE Data
FROM DATABASE_SNAPSHOT = 'Data_SShot'
ALTER DATABASE [Data] SET MULTI_USER WITH NO_WAIT