Instantâneos de banco de dados do SQL Server para teste de integração

14

Estou tentando definir uma maneira de trabalhar com um banco de dados de teste (no SQL Server) para nossos testes de integração.

Minha ideia era executar estas etapas no lançamento do assembly de teste de integração:

  • crie um banco de dados totalmente vazio
  • execute o script "criar objetos de banco de dados" para criar todos os objetos de banco de dados relevantes (tabela, visualizações, sequências etc.)
  • preencha os "dados da base" (valores de pesquisa etc.)
  • tire um instantâneo do banco de dados chamado (db)_Basiscomo "linha de base" para futuros testes de integração

Agora, antes de cada classe de teste (contendo testes 1-n), eu estava planejando simplesmente fazer uma "restauração do instantâneo" para voltar ao estado bem definido, mais ou menos "vazio" do banco de dados. Até agora, funciona como um encanto.

No entanto, há um conjunto de testes de integração que precisam operar em um grande banco de dados de testes - então eu esperava fazer isso antes de cada um desses equipamentos de teste (classes com n testes individuais)

  • restaurar banco de dados a partir da (db)_Basiscaptura instantânea
  • insira essas 50.000 linhas de dados no banco de dados
  • criar outro instantâneo (db)_With_Testdatainstantâneo

e, em seguida, para cada teste, redefina o banco de dados para a (db)_With_Testdataversão de instantâneo bem definida , execute os testes, verifique o resultado e assim por diante.

O problema é: parece que não consigo ter dois instantâneos de banco de dados ao mesmo tempo - depois disso, não consigo restaurar meu banco de dados para nenhum deles ... Continuo recebendo este erro:

Msg 3137, nível 16, estado 4, linha 9 O
banco de dados não pode ser revertido. O nome principal ou o instantâneo está especificado incorretamente, todos os outros instantâneos não foram eliminados ou faltam arquivos.

A mensagem 3013, nível 16, estado 1, linha 9
RESTORE DATABASE está sendo finalizada de maneira anormal.

É assim mesmo que os instantâneos de banco de dados do SQL Server funcionam? Parece muito restritivo ... eu entenderia se não pudesse voltar diretamente para o instantâneo original "(db) _Basis", talvez - mas só porque agora tenho dois instantâneos, não posso voltar ao mais recente ?!?!?

marc_s
fonte
Quanto tempo leva a parte Insert 50.000 linhas ? Você poderia apenas reaplicar isso?
RBarryYoung

Respostas:

12

Infelizmente, é por design.

Retirado da página BOL " Reverter um banco de dados para um instantâneo de banco de dados ":

Limitações e restrições

A reversão não é suportada nas seguintes condições:

  • Atualmente, o banco de dados deve ter apenas uma captura instantânea do banco de dados , para a qual você planeja reverter.
  • Existem grupos de arquivos somente leitura ou compactados no banco de dados.
  • Agora, os arquivos estão offline, mas estavam online quando o instantâneo foi criado

Como alternativa, você pode soltar o primeiro instantâneo (db)_Basis. Eu posso entender que isso parece muito limitador, mas veja da seguinte maneira: os instantâneos são arquivos esparsos com base nos arquivos de dados originais; portanto, a reversão para um instantâneo específico invalidaria todos os instantâneos de qualquer maneira (os arquivos de dados básicos seriam alterados pela operação de reversão) . A limitação pode ser irritante, mas não parece irracional.

spaghettidba
fonte
4

Outra perspectiva será fazer backups e restaurá- los - já que você está apenas criando um banco de dados e esquema vazios com alguns valores de pesquisa.

Além disso, basta inserir 50K linhas, o banco de dados não será tão grande. Se você usar a compactação, o tamanho do backup também será menor.

Você pode ter trabalhos de um Agente TSQL ou apenas scripts (pode ser que você possa criar um procedimento armazenado e chamá-lo após os testes com base na saída obtida).

  • Backup de base - (db)_Basis
  • Com o testdata backup - (db)_With_Testdata

Para que seus scripts de integração sejam executados e com base na saída final, você pode executar um dos trabalhos acima para reverter para o ponto que desejar.

Eu sinto que o método de backup / restauração é muito elegante no seu cenário, pois você está atingindo a limitação de instantâneo do banco de dados . Além disso, Paul Randal publicou um blog sobre um bug desagradável em todas as versões até o SQL Server 2012 ( incluindo o SQL Server 2012) (não tenho certeza se ele foi corrigido em uma CU posterior)

Ao reverter para o instantâneo do banco de dados, o arquivo de log de transações do banco de dados de origem é extraído e substituído por um arquivo de log de 0,5 MB por dois VLFs de 0,25 MB.

Kin Shah
fonte
Sim, estamos usando backup / restauração - mas isso está no intervalo de 5 a 7 segundos, enquanto a restauração de um instantâneo de banco de dados está bem abaixo de 1 segundo - é por isso que estamos procurando uma alternativa ao backup / restauração
marc_s
@marc_s Bem-me um segundo 5-7 é aceitável sem limitações e erros contra um 1 seg com limitações e possíveis erros :-)
Kin Shah
Para nós, é não aceitável - nós estamos procurando uma solução mais rápida
marc_s
@marc_s Eu vejo o seu ponto como não aceitável. Mas você já está atingindo a limitação que é design. Você pode usar apenas 1 instantâneo, mas ainda precisa de um backup para reverter. A escolha é sua - use um único instantâneo, por exemplo, com seus dados de teste e use o backup para restaurar os dados da base.
Kin Shah