統合テスト用のSQL Serverデータベーススナップショット


14

統合テストのために(SQL Serverの)テストデータベースを操作する方法を定義しようとしています。

私のアイデアは、統合テストアセンブリの起動時に次の手順を実行することでした。

  • 完全に空のデータベースを作成する
  • 「データベースオブジェクトの作成」スクリプトを実行して、関連するすべてのデータベースオブジェクト(テーブル、ビュー、シーケンスなど)を作成します。
  • 「ベースデータ」を入力します(ルックアップ値など)
  • (db)_Basis将来の統合テストのために「ベースライン」と呼ばれるデータベースのスナップショットを撮る

すべてのテストクラス(1-nテストを含む)の前に、「スナップショットからの復元」を実行して、データベースの定義済みの多かれ少なかれ「空の」状態に戻すことを計画していました。これまでのところ魅力のように動作します。

ただし、大規模なテストデータベースで動作する必要がある統合テストのセットがあります。そのため、これらの各テストフィクスチャ(n個の個別テストを持つクラス)の前にこれを実行したいと考えていました。

  • (db)_Basisスナップショットからデータベースを復元する
  • これらの50'000 +行のデータをデータベースに挿入します
  • 別のスナップ(db)_With_Testdataショットスナップショットを作成する

その後、テストごとに、データベースを適切に定義された(db)_With_Testdataスナップショットバージョンにリセットし、テストを実行して、結果を検証します。

問題は、2つの dbスナップショットを同時に持つことができないように思われることです。一度行うと、データベースをどちらにも復元できません。このエラーが引き続き発生します。

メッセージ3137、レベル16、状態4、行9
データベースを元に戻すことはできません。プライマリ名またはスナップショット名が不適切に指定されているか、他のすべてのスナップショットが削除されていないか、ファイルが欠落しています。

メッセージ3013、レベル16、状態1、行9
RESTORE DATABASEが異常終了しています。

SQL Serverデータベースのスナップショットは実際にどのように機能しますか?? ひどく制限しているようです.....おそらく元の「(db)_Basis」スナップショットに直接戻れないかどうかはわかりますが、2つのスナップショットを持っているという理由だけで、最新のスナップショットに戻ることさえできません。 ?!?!?


50,000行挿入部分にはどれくらい時間がかかりますか?代わりにそれを再適用してもらえますか?
–RBarryYoung

回答:


12

残念ながら、これは設計によるものです。

BOLページ「データベースをデータベーススナップショットに戻す」から取得:

制限と制限

次の条件では、復帰はサポートされていません。

  • データベースには現在、復元する予定のデータベーススナップショットが1つだけ必要です。
  • データベースには、読み取り専用または圧縮されたファイルグループが存在します。
  • すべてのファイルはオフラインになりましたが、スナップショットの作成時にはオンラインでした

別の方法として、最初のスナップショットを削除できます(db)_Basis。これは非常に制限されているように思えますが、スナップショットは元のデータファイルに基づいたスパースファイルなので、特定のスナップショットに戻すとすべてのスナップショットが無効になります(ベースデータファイルは元に戻す操作によって変更されます) 。制限は迷惑な場合がありますが、不合理に見えません。


4

別の観点は、バックアップを取りそれらを復元することです-いくつかのルックアップ値で空のデータベースとスキーマを作成しているだけですから。

また、50K行を挿入するだけで、データベースはそれほど大きくなりません。圧縮を使用する場合、バックアップサイズも小さくなります。

TSQLエージェントジョブまたはスクリプトのみを使用できます(ストアドプロシージャを作成し、取得した出力に基づいてテスト後に呼び出すことができます)。

  • ベースバックアップ- (db)_Basis
  • テストデータのバックアップあり- (db)_With_Testdata

統合スクリプトを実行し、最終出力に基づいて、上記のジョブのいずれかを実行して、目的のポイントに戻すことができます。

バックアップ/復元方法はあなたのシナリオでは非常にエレガントだと思います データベーススナップショットの制限に。また、Paul Randalは、SQL Server 2012までのすべてのバージョンの厄介なバグについてブログに書いています(後のCUで修正されるかどうかはわかりません)

データベーススナップショットに戻すと、ソースデータベースのトランザクションログファイルが取り出され、2つの0.25MB VLFを持つ0.5MBログファイルに置き換えられます。


しかし、はるかに下回る1秒であるデータベーススナップショットから復元中5-7秒でその者は、範囲- -私たちはバックアップの代替を探している理由です/復元はい、私たちは、バックアップ/リストアを使用してきた
marc_sを

@marc_s私には5-7秒は制限とバグなしで許容されますが、1秒は制限とバグの可能性があります:
Kin Shah

私たちにとって、それは受け入れられません -より迅速な解決策を探しています
-marc_s

@marc_sあなたの主張受け入れられないと思う。しかし、設計上の制限に既に達している。使用できるスナップショットは1つだけですが、元に戻すにはバックアップが必要です。選択はあなた次第です-たとえば、テストデータで単一のスナップショットを使用し、バックアップを使用してベースデータに復元します。
キンシャー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.