Снимки базы данных SQL Server для тестирования интеграции

14

Я пытаюсь определить способ работы с тестовой базой данных (в SQL Server) для нашего интеграционного тестирования.

Моя идея состояла в том, чтобы сделать эти шаги при запуске сборки интеграционного теста:

  • создать полностью пустую базу данных
  • запустить сценарий «создание объектов базы данных» для создания всех соответствующих объектов базы данных (таблицы, представления, последовательности и т. д.)
  • заполнить «базовые данные» (поиск значений и т. д.)
  • сделать снимок базы данных, называемый (db)_Basis«базовой линией» для будущих интеграционных тестов

Теперь перед каждым тестовым классом (содержащим 1-n тестов) я планировал просто выполнить «восстановление из моментального снимка», чтобы вернуться к четко определенному, более или менее «пустому» состоянию базы данных. Работает как шарм до сих пор.

Однако существует ряд интеграционных тестов, которые должны работать с большой тестовой базой данных - поэтому я надеялся сделать это перед каждым из этих тестовых тестов (классы с n отдельными тестами)

  • восстановить базу данных из (db)_Basisснимка
  • вставить эти 50'000 + строк данных в базу данных
  • создать еще один моментальный (db)_With_Testdataснимок

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

Проблема в том, что у меня не может быть двух снимков базы данных одновременно - как только я это сделаю, я не смогу восстановить свою базу данных ни к одному из них .... Я продолжаю получать эту ошибку:

Сообщение 3137, уровень 16, состояние 4, строка 9
База данных не может быть восстановлена. Неправильно указаны имена основного или моментального снимка, все остальные моментальные снимки не были удалены или отсутствуют файлы.

Сообщение 3013, уровень 16, состояние 1, строка 9
RESTORE DATABASE завершается ненормально.

Это действительно, как работают снимки базы данных SQL Server? Кажется ужасно ограничивающим ..... Я бы понял, если бы я не мог вернуться непосредственно к исходному снимку "(db) _Basis", может быть - но только потому, что у меня теперь есть два снимка, я даже не могу вернуться к самому последнему ?!?!?

marc_s
источник
Сколько времени занимает вставка 50 000 строк ? Не могли бы вы просто применить это вместо этого?
RBarryYoung

Ответы:

12

К сожалению, это по замыслу.

Взято со страницы BOL « Вернуть базу данных в моментальный снимок базы данных »:

Ограничения и ограничения

Возврат не поддерживается при следующих условиях:

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

В качестве альтернативы вы можете удалить первый снимок (db)_Basis. Я могу понять, что это кажется очень ограничивающим, но посмотрите на это следующим образом: снимки - это разреженные файлы, основанные на исходных файлах данных, поэтому возврат к определенному снимку в любом случае сделает недействительными все снимки (базовые файлы данных будут изменены с помощью операции возврата) , Ограничение может быть раздражающим, но не выглядит необоснованным.

spaghettidba
источник
4

Другой перспективой будет создание резервных копий и их восстановление - поскольку вы просто создаете пустую базу данных и схему с некоторыми значениями поиска.

Кроме того, просто вставив 50К строк, база данных не будет такой большой. Если вы используете сжатие, размер резервной копии также будет меньше.

У вас могут быть задания агента TSQL или просто сценарии (может быть, вы можете создать хранимую процедуру и просто вызывать ее после ваших тестов, основываясь на полученном вами результате).

  • База резервного копирования - (db)_Basis
  • С резервной копией тестовых данных - (db)_With_Testdata

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

Я чувствую, что метод резервного копирования / восстановления является очень элегантным в вашем сценарии, поскольку вы используете ограничение снимка базы данных . Кроме того, Пол Рэндал писал о неприятной ошибке во всех версиях, включая SQL Server 2012 включительно (не уверен, исправлена ​​ли она в более поздней CU)

При возврате к моментальному снимку базы данных файл журнала транзакций исходной базы данных извлекается и заменяется файлом журнала 0,5 МБ с двумя VLF по 0,25 МБ.

Кин Шах
источник
Да, мы использовали резервное копирование / восстановление - но это в диапазоне 5-7 секунд, в то время как восстановление из моментального снимка базы данных значительно ниже 1 секунды - поэтому мы ищем альтернативу резервному копированию / восстановлению
marc_s
@marc_s Ну, для меня приемлемо 5-7 секунд без ограничений и ошибок против 1 секунды с ограничениями и возможными ошибками :-)
Кин Шах
Для нас это не приемлемо - мы ищем для быстрого решения
marc_s
@marc_s Я вижу вашу точку , как не приемлемо. Но вы уже попали в ограничение, которое предусмотрено дизайном. Вы можете использовать только 1 снимок, но все равно требуется резервная копия, чтобы вернуться обратно. Выбор за вами - используйте один снимок, например, с вашими тестовыми данными, и используйте резервную копию для восстановления базовых данных.
Кин Шах