Sandbox do SQL Server

9

Estou tentando configurar uma caixa de areia para os desenvolvedores de relatórios trabalharem. Meu plano atual é "redefinir" o banco de dados todas as noites, mas não tenho certeza de como fazê-lo. O que quero dizer com redefinição é que quero eliminar essencialmente todas as tabelas, visualizações, procedimentos armazenados etc. de todos os bancos de dados, exceto um, no servidor. Suponho que outra opção seria soltar e recriar o banco de dados também, mas tenho certeza de que isso significaria recuperar o acesso a todos os grupos / pessoas do AD apropriados também.

Realmente não sei qual seria a melhor maneira de fazer isso, então espero que alguns de vocês possam fornecer boas idéias / sugestões. Obrigado.

Para maior clareza, queremos essencialmente fazer isso com nosso banco de dados: http://try.discourse.org/t/this-site-is-a-sandbox-it-is-reset-every-day/57 . A única diferença é que não queremos recriar nossos usuários todos os dias.

Versão: SQL Server 2008
Edition: Desenvolvedor e Empresa

Kittoes0124
fonte

Respostas:

8

Outra idéia seria simplesmente configurar um trabalho noturno que faça um backup copy_only e o restaure no servidor dev (ou no mesmo servidor, se você tiver apenas um, mas isso pode não ser uma ótima idéia). O bom disso é que a restauração pode ir para qualquer servidor (ou vários servidores) e pode ser completamente dissociada de qualquer atividade no banco de dados primário.

No servidor 1:

BACKUP DATABASE db TO DISK = '\\someshare\file.bak' 
  WITH COPY_ONLY, INIT, COMPRESSION;

No servidor 2:

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY;

Pode ser necessário adicionar também MOVEcomandos se o layout do disco entre os servidores for diferente (ou se você estiver colocando a cópia no mesmo servidor).

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'data_file_name' TO 'D:\somepath\somefile.mdf',
  MOVE 'log_file_name'  TO 'E:\somepath\somefile.ldf';

Se você estiver restaurando no mesmo servidor, não deverá ter problemas com os usuários. Se você restaurar para um servidor diferente, seus usuários existirão, mas os logons no nível do servidor talvez não. Existem scripts para corrigir isso e um novo recurso no SQL Server 2012 ( bancos de dados contidos ) que elimina completamente o problema.

Aaron Bertrand
fonte
Temos dev / prod, mas dev é o único servidor em que isso estaria acontecendo. Prod é apenas para processos prontos para prod.
Kittoes0124
Esta é a solução que eu escolheria, mas tenha em mente que, na maioria dos casos, você não deseja simplesmente copiar a produção para o ambiente de desenvolvimento. Por favor, tenha uma medida (script?) Em vigor que, por exemplo, remova ou oculte os endereços de email dos usuários, detalhes de contato etc. Você não deseja que seus desenvolvedores comecem a enviar acidentalmente emails para os usuários.
usar o seguinte código
5

Como você tem uma instância com o mecanismo Enterprise Edition, eu usaria instantâneos de banco de dados .

Isso permitirá reverter rápida e facilmente todas as alterações feitas durante o dia, sem a necessidade de restaurar todo o banco de dados.

Observe que, se os desenvolvedores planejam fazer grandes carregamentos de dados (parece que não são?), Isso pode não ser apropriado.

Jon Seigel
fonte
Por que não seria apropriado se eles estivessem fazendo grandes carregamentos de dados? Os nossos podem carregar, digamos .... 8 milhões de linhas de 100 colunas de vez em quando (mesmo que "não devam"), mas não queremos necessariamente impedi-los de fazê-lo. Tudo o que realmente importa é que tudo fique destruído no final do dia.
Kittoes0124
2
@Kittoes porque um instantâneo deve ser mantido quando os dados de origem forem alterados. Ele precisa puxar as páginas existentes da fonte, se a fonte mudar, para manter a visualização "antes". Isso não é feito até que os dados de origem sejam alterados (um instantâneo usa um arquivo esparso vazio, exceto os deltas). Essa manutenção pode se tornar bastante cara. Veja como os instantâneos do banco de dados funcionam .
Aaron Bertrand
@AaronBertrand Ok, então, se o banco de dados aumentar para 8 GB durante um dia, quando o instantâneo for restaurado, todos os novos dados serão removidos, mas o banco de dados ainda terá 8 GB de tamanho? Ou estou entendendo mal?
Kittoes0124
@Kittoes, um instantâneo é somente leitura, portanto, você só poderá carregar novos dados no banco de dados de origem. Se você adicionar 8 GB durante o dia, ele não ficará visível para o instantâneo. Quando você reverter / soltar o instantâneo, o banco de dados de origem ainda terá esses 8 GB de dados e será dimensionado de acordo. Se você tirar outro instantâneo, os novos dados estarão visíveis. Se você remover 8 GB durante o dia, ele será adicionado ao instantâneo.
Aaron Bertrand
11
@Kittoes, se você quiser desfazer a carga de dados de 8 GB, revertendo para o momento em que a captura instantânea foi tirada, sim, ele deve retornar seus arquivos de dados para o tamanho que eles tinham (se você realmente deseja que os arquivos sejam pequenos novamente, então você pode simplesmente crescer mais quando carregar 8 GB novamente amanhã, é outra questão). Mas eu não testei esse cenário explicitamente. E como o artigo que eu vinculei a menciona, isso não é necessariamente infalível, pois também depende da confiabilidade do armazenamento subjacente. Um backup é uma maneira mais segura de fazer isso.
Aaron Bertrand
0

Deixe-me adicionar alguns centavos para ver se isso ajuda você:

Na minha empresa, estamos enfrentando a mesma situação que todas as noites os desenvolvedores desejam atualizar os bancos de dados que estão usando durante o dia. Isto significa que temos um conjunto de bancos de dados que de Dev não tocam - digamos Um e outro conjunto de bancos de dados que são exata copiar A, mas eles fazem o seu coisas, mas quer ficar atualizado a cada noite - Vamos dizer que B . Isso acontece em 1 instância de servidor único.

O que eu implementei é um processo de restauração noturna para conseguir isso. Abaixo está como funciona:

Crie uma tabela de drivers com uma lista de bancos de dados que precisam ser restaurados todas as noites (como você mencionou).

Tabela: nightly_restore (OriginalDB, RestoreDB, backuplocation, enabled_YN, Results, PASS_FAIL)

Em seguida, você pode escrever algum TSQL que percorrerá a lista de bancos de dados da tabela acima e, em seguida, executará as restaurações e registrará qualquer sucesso ou falha em Resultados e um pouco 1 = Aprovado ou 0 = Reprovado. Enabled_YN determinará se esse banco de dados precisa ser restaurado ou não.

Se houver mais bancos de dados que serão adicionados no futuro, basta inserir os da tabela e definir o bit enabled_YN como Y (ativado).

Dessa forma, o processo será mais flexível e gerenciável.

Se você quiser o SQL que eu escrevi (tenho certeza de que poderá escrevê-lo :-)), basta me enviar um ping ou adicionar um comentário e eu o compartilharei.

HTH

Kin Shah
fonte