Невозможно восстановить базу данных в моментальный снимок в 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 ответа

Решение

Есть несколько вещей, которые необходимо сделать перед восстановлением БД.

  1. Получить количество активных пользователей для БД и убить сеансы.
  2. Переведите БД в автономный режим и онлайн, что приведет к прекращению всех скрытых подключений.
  3. Теперь восстановите БД. Если это не удается, переведите БД в автономный режим и попробуйте восстановить.
  4. После восстановления переведите БД в оперативный режим.

Это шаги, которые я использую для восстановления БД, и это работало для меня в течение длительного времени.

Сделайте следующее:

      ALTER DATABASE [Data] SET SINGLE_USER

RESTORE DATABASE Data 
FROM DATABASE_SNAPSHOT = 'Data_SShot'

ALTER DATABASE [Data] SET MULTI_USER WITH NO_WAIT
Другие вопросы по тегам