Istantanee del database SQL Server per i test di integrazione


14

Sto cercando di definire un modo di lavorare con un database di test (in SQL Server) per i nostri test di integrazione.

La mia idea era di eseguire questi passaggi all'avvio dell'assembly test di integrazione:

  • creare un database totalmente vuoto
  • eseguire lo script "crea oggetti database" per creare tutti gli oggetti database rilevanti (tabella, viste, sequenze ecc.)
  • riempire i "dati di base" (valori di ricerca ecc.)
  • eseguire uno snapshot del database chiamato (db)_Basiscome "linea di base" per futuri test di integrazione

Ora, prima di ogni classe di test (contenente test 1-n), stavo pianificando di fare semplicemente un "ripristino da istantanea" per tornare allo stato ben definito, più o meno "vuoto" del database. Finora funziona come un fascino.

Tuttavia, ci sono una serie di test di integrazione che devono funzionare su un ampio database di test, quindi speravo di farlo prima di ciascuna di queste apparecchiature di test (classi con n singoli test)

  • ripristinare il database (db)_Basisdall'istantanea
  • inserisci quelle 50'000 + righe di dati nel database
  • crea un'altra (db)_With_Testdataistantanea

e quindi per ogni test, reimpostare il database sulla (db)_With_Testdataversione snapshot ben definita , eseguire i test, verificare il risultato e così via.

Il problema è: non riesco ad avere due istantanee db contemporaneamente - una volta fatto, non riesco a ripristinare il mio database su nessuno dei due .... Continuo a ricevere questo errore:

Messaggio 3137, livello 16, stato 4, riga 9
Database non può essere ripristinato. Il nome principale o quello dell'istantanea non sono stati specificati in modo errato, tutte le altre istantanee non sono state eliminate o sono presenti file mancanti.

Messaggio 3013, livello 16, stato 1, riga 9
RIPRISTINA DATABASE si sta chiudendo in modo anomalo.

È davvero così che funzionano le snapshot del database di SQL Server ?? Sembra terribilmente restrittivo ..... Capirei se non potessi tornare direttamente all'istantanea "(db) _Basis" originale forse - ma solo perché ora ho due istantanee, non posso nemmeno tornare al più recente ?!?!?


Quanto tempo richiede la parte Inserisci 50.000 righe ? Potresti riapplicarlo invece?
RBarryYoung,

Risposte:


12

Sfortunatamente, è di progettazione.

Tratto dalla pagina BOL " Ripristina un database in un'istantanea del database ":

Limitazioni e restrizioni

Il ripristino non è supportato nelle seguenti condizioni:

  • Al momento il database deve avere un solo snapshot del database in cui si prevede di ripristinare.
  • Nel database esistono filegroup di sola lettura o compressi.
  • Tutti i file sono ora offline ma erano online quando è stata creata l'istantanea

In alternativa, è possibile eliminare la prima istantanea (db)_Basis. Posso capire che questo sembra molto limitante, ma guardalo in questo modo: gli snapshot sono file sparsi basati sui file di dati originali, quindi il ripristino di uno snapshot specifico invaliderebbe comunque tutti gli snapshot (i file di dati di base verrebbero modificati dall'operazione di ripristino) . La limitazione può essere fastidiosa, ma non sembra irragionevole.


4

Un'altra prospettiva sarà quella di eseguire i backup e ripristinarli , poiché si stanno creando solo database e schemi vuoti con alcuni valori di ricerca.

Inoltre, inserendo solo 50.000 righe, il database non sarà così grande. Se si utilizza la compressione, anche le dimensioni del backup saranno inferiori.

Puoi avere un lavoro dell'agente TSQL o solo script (potrebbe essere possibile creare una procedura memorizzata e chiamarla dopo i test in base all'output ottenuto).

  • Backup di base - (db)_Basis
  • Con backup testdata - (db)_With_Testdata

avere gli script di integrazione in esecuzione e in base all'output finale, è possibile eseguire uno dei lavori sopra riportati per tornare a qualsiasi punto desiderato.

Ritengo che il metodo di backup / ripristino sia molto elegante nel tuo scenario poiché stai colpendo la limitazione dell'istantanea del database . Inoltre, Paul Randal ha scritto un blog su un brutto bug in tutte le versioni fino a SQL Server 2012 incluso (non sono sicuro che sia stato corretto in una CU successiva)

Quando si ripristina l'istantanea del database, il file di registro delle transazioni del database di origine viene rimosso e sostituito con un file di registro da 0,5 MB con due VLF da 0,25 MB.


Sì, abbiamo utilizzato il backup / ripristino, ma nell'intervallo 5-7 secondi, mentre il ripristino da un'istantanea del database è ben al di sotto di 1 secondo, ecco perché stiamo cercando un'alternativa al backup / ripristino
marc_s

@marc_s Beh, per me un 5-7 secondi è accettabile senza limitazioni e bug contro un 1 secondo con limitazioni e possibili bug :-)
Kin Shah,

Per noi, è non è accettabile, - stiamo cercando una soluzione più rapida
marc_s

@marc_s Ritengo che il tuo punto non sia accettabile. Ma stai già colpendo la limitazione che è design. È possibile utilizzare solo 1 snapshot ma è comunque necessario un backup per ripristinare. A te la scelta: usa una singola istantanea, ad es. Con i tuoi dati di test e usa il backup per ripristinare i dati di base.
Kin Shah,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.