Migawki bazy danych SQL Server do testowania integracji

14

Próbuję zdefiniować sposób pracy z testową bazą danych (w SQL Server) na potrzeby naszych testów integracyjnych.

Moim pomysłem było wykonanie następujących kroków podczas uruchamiania zestawu testowego integracji:

  • utwórz całkowicie pustą bazę danych
  • uruchom skrypt „twórz obiekty bazy danych”, aby utworzyć wszystkie odpowiednie obiekty bazy danych (tabela, widoki, sekwencje itp.)
  • wypełnij „dane podstawowe” (wartości wyszukiwania itp.)
  • weź migawkę bazy danych o nazwie (db)_Basis„linia bazowa” do przyszłych testów integracyjnych

Teraz przed każdą klasą testów (zawierającą testy 1-n) planowałem po prostu wykonać „przywracanie z migawki”, aby wrócić do dobrze zdefiniowanego, mniej lub bardziej „pustego” stanu bazy danych. Jak dotąd działa jak urok.

Istnieje jednak zestaw testów integracyjnych, które muszą działać na dużej bazie testowej - miałem więc nadzieję, że zrobię to przed każdym z tych urządzeń testowych (klasy z n pojedynczymi testami)

  • przywróć bazę danych z (db)_Basismigawki
  • wstaw te 50'000 + wierszy danych do bazy danych
  • utwórz kolejną (db)_With_Testdatamigawkę

a następnie dla każdego testu zresetuj bazę danych do dobrze zdefiniowanej (db)_With_Testdatawersji migawki, uruchom testy, sprawdź wynik i tak dalej.

Problem w tym, że nie mogę mieć dwóch migawek bazy danych jednocześnie - po wykonaniu tej czynności nie mogę przywrócić bazy danych do żadnej z nich ... Nadal pojawia się ten błąd:

Msg 3137, poziom 16, stan 4, wiersz 9
Baza danych nie może zostać przywrócona. Nazwy podstawowe lub migawki są niepoprawnie określone, wszystkie inne migawki nie zostały usunięte lub brakuje plików.

Msg 3013, poziom 16, stan 1, wiersz 9
PRZYWRACANIE BAZY DANYCH kończy się nieprawidłowo.

Czy tak naprawdę działają migawki bazy danych SQL Server? Wydaje się okropnie ograniczające ..... Zrozumiałbym, gdybym nie mógł wrócić bezpośrednio do oryginalnej migawki „(db) _Basis” - ale tylko dlatego, że mam teraz dwie migawki, nie mogę nawet wrócić do najnowszej ?!?!?

marc_s
źródło
Jak długo trwa wkładka 50 000 wierszy ? Czy możesz po prostu ponownie to zastosować?
RBarryYoung

Odpowiedzi:

12

Niestety jest to zgodne z projektem.

Pobrane ze strony BOL „ Przywróć bazę danych do migawki bazy danych ”:

Ograniczenia i ograniczenia

Przywracanie nie jest obsługiwane w następujących warunkach:

  • Baza danych musi obecnie mieć tylko jedną migawkę bazy danych , do której planujesz przywrócić.
  • W bazie danych istnieją dowolne grupy plików tylko do odczytu lub skompresowane.
  • Wszystkie pliki są teraz w trybie offline, ale były w trybie online podczas tworzenia migawki

Alternatywnie możesz upuścić pierwszą migawkę (db)_Basis. Rozumiem, że wydaje się to bardzo ograniczające, ale spójrz na to w ten sposób: migawki to rzadkie pliki oparte na oryginalnych plikach danych, więc powrót do konkretnej migawki i tak unieważniłby wszystkie migawki (podstawowe pliki danych zostałyby zmienione przez operację przywracania) . Ograniczenie może być denerwujące, ale nie wydaje się nieuzasadnione.

spaghettidba
źródło
4

Inną perspektywą będzie tworzenie kopii zapasowych i przywracanie ich - ponieważ tworzysz tylko pustą bazę danych i schemat z pewnymi wartościami odnośników.

Ponadto po wstawieniu 50 000 wierszy baza danych nie będzie tak duża. Jeśli użyjesz kompresji, rozmiar kopii zapasowej również będzie mniejszy.

Możesz mieć zadania agenta TSQL lub po prostu skrypty (może być tak, że możesz utworzyć procedurę składowaną i po prostu wywołać ją po testach na podstawie otrzymanych danych wyjściowych).

  • Baza kopii zapasowej - (db)_Basis
  • Z kopią zapasową danych testowych - (db)_With_Testdata

jeśli masz uruchomione skrypty integracyjne i na podstawie ostatecznego wyniku, możesz uruchomić jedno z powyższych zadań, aby powrócić do dowolnego punktu, w którym chcesz.

Uważam, że metoda tworzenia kopii zapasowych / przywracania jest bardzo elegancka w twoim scenariuszu, ponieważ osiągasz ograniczenie migawki bazy danych . Ponadto Paul Randal pisał na blogu o paskudnym błędzie we wszystkich wersjach do SQL Servera 2012 włącznie (nie jestem pewien, czy zostanie to naprawione w późniejszym CU)

Po przywróceniu migawki bazy danych plik dziennika transakcji źródłowej bazy danych jest zgrywany i zastępowany plikiem dziennika 0,5 MB z dwoma plikami VLF 0,25 MB.

Kin Shah
źródło
Tak, używamy tworzenia kopii zapasowych / przywracania - ale to w zakresie 5-7 sekund, podczas gdy przywracanie z migawki bazy danych jest znacznie poniżej 1 sekundy - dlatego szukamy alternatywy dla tworzenia kopii zapasowych / przywracania
marc_s
@marc_s Cóż, dla mnie akceptowalna jest 5-7 sekund bez ograniczeń i błędów w porównaniu do 1 sekundy z ograniczeniami i możliwymi błędami :-)
Kin Shah
Dla nas jest to nie do przyjęcia - szukamy szybszego rozwiązania
marc_s
@marc_s Uważam twój punkt widzenia za niedopuszczalny . Ale już osiągasz ograniczenia, które są projektowane. Możesz użyć tylko 1 migawki, ale nadal potrzebujesz kopii zapasowej, aby przywrócić. Wybór należy do Ciebie - użyj pojedynczej migawki, np. Z danymi testowymi i użyj kopii zapasowej, aby przywrócić dane podstawowe.
Kin Shah,