Instantanés de base de données SQL Server pour les tests d'intégration


14

J'essaie de définir une façon de travailler avec une base de données de test (dans SQL Server) pour nos tests d'intégration.

Mon idée était de faire ces étapes lors du lancement de l'assemblage de test d'intégration:

  • créer une base de données totalement vide
  • exécuter le script "créer des objets de base de données" pour créer tous les objets de base de données pertinents (table, vues, séquences, etc.)
  • remplir les "données de base" (valeurs de recherche, etc.)
  • prendre un instantané de la base de données appelé (db)_Basis"ligne de base" pour les futurs tests d'intégration

Maintenant, avant chaque classe de test (contenant des tests 1-n), je prévoyais simplement de faire une "restauration à partir d'un instantané" pour revenir à l'état bien défini, plus ou moins "vide" de la base de données. Fonctionne comme un charme jusqu'à présent.

Cependant, il existe un ensemble de tests d'intégration qui doivent fonctionner sur une grande base de données de tests - j'espérais donc le faire avant chacun de ces tests (classes avec n tests individuels)

  • restaurer la base de données à partir de l' (db)_Basisinstantané
  • insérer ces 50'000 + lignes de données dans la base de données
  • créer un autre instantané (db)_With_Testdatainstantané

puis pour chaque test, réinitialisez la base de données à la (db)_With_Testdataversion d'instantané bien définie , exécutez les tests, vérifiez le résultat, etc.

Le problème est: je n'arrive pas à avoir deux instantanés de base de données en même temps - une fois que je le fais, je ne peux pas restaurer ma base de données sur l'un d'eux .... Je reçois toujours cette erreur:

Msg 3137, niveau 16, état 4, ligne 9, la
base de données ne peut pas être rétablie. Le nom principal ou le nom de l'instantané n'est pas spécifié correctement, tous les autres instantanés n'ont pas été supprimés ou il manque des fichiers.

Msg 3013, niveau 16, état 1, ligne 9
RESTORE DATABASE se termine anormalement.

Est-ce vraiment ainsi que fonctionnent les instantanés de base de données SQL Server? Semble terriblement restrictif ... Je comprendrais si je ne pouvais pas revenir directement à l'instantané "(db) _Basis" d'origine - mais juste parce que j'ai maintenant deux instantanés, je ne peux même pas revenir au plus récent ?!?!?


Combien de temps dure la partie Insérer 50 000 lignes ? Pourriez-vous simplement réappliquer cela à la place?
RBarryYoung

Réponses:


12

Malheureusement, c'est par conception.

Tiré de la page BOL " Rétablir une base de données en un instantané de base de données ":

Limitations et restrictions

La restauration n'est pas prise en charge dans les conditions suivantes:

  • La base de données doit actuellement avoir un seul instantané de base de données , auquel vous prévoyez de revenir.
  • Tous les groupes de fichiers en lecture seule ou compressés existent dans la base de données.
  • Tous les fichiers sont maintenant hors ligne mais étaient en ligne lors de la création de l'instantané

Comme alternative, vous pouvez supprimer le premier instantané (db)_Basis. Je peux comprendre que cela semble très limitant, mais regardez-le de cette façon: les instantanés sont des fichiers clairsemés basés sur les fichiers de données d'origine, donc le retour à un instantané spécifique invaliderait de toute façon tous les instantanés (les fichiers de données de base seraient modifiés par l'opération de restauration) . La limitation peut être gênante, mais ne semble pas déraisonnable.


4

Une autre perspective sera de prendre des sauvegardes et de les restaurer - puisque vous créez simplement une base de données et un schéma vides avec quelques valeurs de recherche.

De plus, en insérant simplement 50K lignes, la base de données ne sera pas si grande. Si vous utilisez la compression, la taille de la sauvegarde sera également inférieure.

Vous pouvez avoir un travail TSQL Agent ou simplement des scripts (vous pouvez peut-être créer une procédure stockée et l'appeler simplement après vos tests en fonction de la sortie que vous obtenez).

  • Sauvegarde de base - (db)_Basis
  • Avec sauvegarde des données de test - (db)_With_Testdata

exécutez vos scripts d'intégration et, en fonction de la sortie finale, vous pouvez exécuter l'un des travaux ci-dessus pour revenir au point que vous souhaitez.

Je pense que la méthode de sauvegarde / restauration est beaucoup plus élégante dans votre scénario puisque vous atteignez la limitation des instantanés de base de données . En outre, Paul Randal a blogué à propos d'un bogue désagréable dans toutes les versions jusqu'à et y compris SQL Server 2012 (je ne sais pas s'il est corrigé dans une CU ultérieure)

Lorsque vous revenez à l'instantané de la base de données, le fichier journal des transactions de la base de données source est extrait et remplacé par un fichier journal de 0,5 Mo avec deux VLF de 0,25 Mo.


Oui, nous utilisons la sauvegarde / restauration - mais cela se situe dans la plage de 5 à 7 secondes, tandis que la restauration à partir d'un instantané de base de données est bien inférieure à 1 seconde - c'est pourquoi nous recherchons une alternative à la sauvegarde / restauration
marc_s

@marc_s Eh bien pour moi un 5-7 sec est acceptable sans limitations et bugs vs 1 sec avec limitations et bugs possibles :-)
Kin Shah

Pour nous, ce n'est pas acceptable - nous recherchons une solution plus rapide
marc_s

@marc_s Je considère que votre argument n'est pas acceptable. Mais vous atteignez déjà la limitation, c'est par conception. Vous ne pouvez utiliser qu'un seul instantané, mais vous avez toujours besoin d'une sauvegarde pour revenir en arrière. Vous avez le choix - utilisez un seul instantané, par exemple avec vos données de test et utilisez la sauvegarde pour restaurer les données de base.
Kin Shah
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.