SQL Server-Datenbank-Snapshots für Integrationstests


14

Ich versuche, eine Methode zum Arbeiten mit einer Testdatenbank (in SQL Server) für unsere Integrationstests zu definieren.

Meine Idee war, diese Schritte beim Start der Integrationstest-Assembly auszuführen:

  • Erstellen Sie eine völlig leere Datenbank
  • Führen Sie das Skript "Datenbankobjekte erstellen" aus, um alle relevanten Datenbankobjekte (Tabellen, Ansichten, Sequenzen usw.) zu erstellen.
  • Füllen Sie die "Basisdaten" (Nachschlagewerte usw.)
  • Erstellen Sie einen Datenbank-Snapshot, der (db)_Basisals "Basislinie" für zukünftige Integrationstests bezeichnet wird

Jetzt plante ich vor jeder Testklasse (die 1-n-Tests enthielt) einfach eine "Wiederherstellung aus dem Snapshot", um wieder in den gut definierten, mehr oder weniger "leeren" Zustand der Datenbank zu gelangen. Funktioniert bisher wie ein Zauber.

Es gibt jedoch eine Reihe von Integrationstests, die auf einer großen Testdatenbank ausgeführt werden müssen. Daher hatte ich die Hoffnung, dies vor jedem dieser Testgeräte zu tun (Klassen mit n Einzeltests).

  • Datenbank aus dem (db)_BasisSnapshot wiederherstellen
  • Fügen Sie diese über 50'000 Datenzeilen in die Datenbank ein
  • Erstellen Sie einen weiteren (db)_With_TestdataSchnappschuss

Setzen Sie dann für jeden Test die Datenbank auf die gut definierte (db)_With_TestdataSnapshot-Version zurück, führen Sie die Tests aus, überprüfen Sie das Ergebnis und so weiter.

Das Problem ist, dass anscheinend nicht zwei Datenbank-Snapshots gleichzeitig vorhanden sind. Wenn dies der Fall ist, kann keine der beiden Datenbanken wiederhergestellt werden. Es wird immer wieder der folgende Fehler angezeigt:

Meldung 3137, Ebene 16, Status 4, Zeile 9 Die
Datenbank kann nicht zurückgesetzt werden. Entweder der primäre Name oder der Name des Snapshots sind falsch angegeben, alle anderen Snapshots wurden nicht gelöscht oder es fehlen Dateien.

Meldung 3013, Ebene 16, Status 1, Zeile 9
DATENBANK WIEDERHERSTELLEN wird abnormal beendet.

Funktionieren SQL Server-Datenbank-Snapshots wirklich so? Scheint schrecklich einschränkend ..... Ich würde verstehen, wenn ich nicht direkt zum ursprünglichen "(db) _Basis" -Snapshot zurückkehren könnte - aber nur, weil ich jetzt zwei Snapshots habe, kann ich nicht einmal zum neuesten zurückkehren ?!?!?


Wie lange dauert das Einfügen von 50.000 Zeilen ? Könnten Sie das stattdessen einfach erneut anwenden?
RBarryYoung

Antworten:


12

Leider ist es beabsichtigt.

Entnommen aus der BOL-Seite " Datenbank auf einen Datenbank-Snapshot zurücksetzen ":

Einschränkungen und Restriktionen

Das Zurücksetzen wird unter den folgenden Bedingungen nicht unterstützt:

  • Die Datenbank darf derzeit nur einen Datenbank-Snapshot enthalten , auf den Sie zurückgreifen möchten.
  • Alle schreibgeschützten oder komprimierten Dateigruppen sind in der Datenbank vorhanden.
  • Alle Dateien sind jetzt offline, waren jedoch online, als der Snapshot erstellt wurde

Alternativ können Sie den ersten Schnappschuss ablegen (db)_Basis. Ich kann verstehen, dass dies sehr einschränkend zu sein scheint, aber sehen Sie es so: Schnappschüsse sind spärliche Dateien, die auf den ursprünglichen Datendateien basieren, so dass das Zurücksetzen auf einen bestimmten Schnappschuss sowieso alle Schnappschüsse ungültig machen würde (die Basisdatendateien würden durch den Zurücksetzungsvorgang geändert). . Die Einschränkung kann ärgerlich sein, sieht aber nicht unangemessen aus.


4

Eine andere Perspektive besteht darin, Backups zu erstellen und wiederherzustellen , da Sie lediglich eine leere Datenbank und ein leeres Schema mit einigen Suchwerten erstellen.

Außerdem ist die Datenbank beim Einfügen von 50.000 Zeilen nicht so groß. Wenn Sie die Komprimierung verwenden, verringert sich auch die Sicherungsgröße.

Sie können einen TSQL-Agenten-Job oder nur Skripte haben (möglicherweise können Sie eine gespeicherte Prozedur erstellen und diese nach Ihren Tests auf der Grundlage der erhaltenen Ausgabe aufrufen).

  • Basissicherung - (db)_Basis
  • Mit Testdatensicherung - (db)_With_Testdata

Wenn Ihre Integrationsskripts ausgeführt werden und die endgültige Ausgabe vorliegt, können Sie einen der oben genannten Jobs ausführen, um zu dem gewünschten Zeitpunkt zurückzukehren.

Ich bin der Meinung, dass die Sicherungs- / Wiederherstellungsmethode in Ihrem Szenario sehr elegant ist, da Sie die Beschränkung für Datenbank-Snapshots treffen . Außerdem hat Paul Randal über einen bösen Fehler in allen Versionen bis einschließlich SQL Server 2012 gebloggt (nicht sicher, ob er in einer späteren CU behoben wurde).

Wenn Sie zum Datenbank-Snapshot zurückkehren, wird die Transaktionsprotokolldatei der Quelldatenbank ausgelesen und durch eine 0,5-MB-Protokolldatei mit zwei 0,25-MB-VLFs ersetzt.


Ja, wir haben Backup / Restore verwendet - aber das liegt im Bereich von 5-7 Sekunden, während das Wiederherstellen von einem Datenbank-Snapshot deutlich unter 1 Sekunde liegt. Deshalb suchen wir nach einer Alternative zu Backup / Restore
marc_s

@ marc_s Nun, für mich sind 5-7 Sek. ohne Einschränkungen und Bugs akzeptabel gegenüber 1 Sek. mit Einschränkungen und möglichen Bugs :-)
Kin Shah

Für uns ist es nicht akzeptabel - wir suchen nach einer schnelleren Lösung
marc_s

@marc_s Ich sehe deinen Standpunkt als nicht akzeptabel an. Aber Sie stoßen bereits auf die Einschränkung, die beabsichtigt ist. Sie können nur einen Snapshot verwenden, benötigen jedoch noch ein Backup, um zurückzusetzen. Sie haben die Wahl - verwenden Sie einen einzelnen Snapshot, z. B. mit Ihren Testdaten, und verwenden Sie Backup, um die Basisdaten wiederherzustellen.
Kin Shah
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.