Eu tenho um banco de dados de produção muito grande e um banco de dados de ambiente de teste muito grande no SQL Server 2008R2. Ambos os bancos de dados têm estrutura de tabela semelhante, mas diferentes usuários / logins / permissões / funções.
Eu preciso atualizar apenas algumas tabelas no banco de dados de teste periodicamente da produção, cerca de uma vez por mês.
A maneira atual em que planejo fazer isso é
- Use o utilitário BCP para fazer uma exportação das tabelas necessárias de Produção.
- Copie o arquivo de exportação bcp no servidor de teste
- Desativar índices e restrições em todas as tabelas que estou atualizando no teste
- Truncar as tabelas de banco de dados de teste
- Carregue os dados novamente nas tabelas de banco de dados de teste usando o BCP.
- reconstruir índices e reativar restrições em Teste
Tudo isso parece um pouco complicado demais para uma tarefa tão pequena. Também parece que isso geraria muito refazer (no t-log). Existe uma maneira melhor de fazer isso?
Outra maneira que pensei em fazer isso é restaurar um backup do Production para o ambiente de teste - mas o problema é que um backup completo seria muito grande e não preciso que todas as tabelas sejam atualizadas, apenas algumas- e também os usuários e a segurança no banco de dados de produção são diferentes de teste. Isso seria substituído pelas configurações de segurança no banco de dados de produção se eu restaurar o banco de dados inteiro.
fonte
Respostas:
Existem 2 métodos que atenderão às suas necessidades:
(Nota: Se as tabelas forem referenciadas por chave estrangeira, você não poderá usá-lo
TRUNCATE
. É necessário excluir em pedaços . Como alternativa, você pode eliminar todos os índices + Chaves estrangeiras e carregar dados e, em seguida, recriá-los).BCP OUT e BULK INSERT INTO no banco de dados de destino .
Ativar sinalizador de rastreamento 610 - inserções minimamente registradas em tabelas indexadas.
-
Método 2: SSIS - Meu método preferido neste caso.
Referência: O Guia de Desempenho para Carregamento de Dados e minha resposta para - Inserir na tabela selecione * da tabela versus inserção em massa
fonte
Não há necessidade de fazer backups e restaurações, ou chamar / coordenar processos externos (por exemplo, BCP), ou mesmo mexer com o SSIS (muito poderoso, muito legal, mas se eu puder evitá-lo, certamente o farei :). Você pode lidar com tudo isso no conforto do T-SQL, em um procedimento armazenado que você pode agendar via SQL Agent ou em um script que você executa uma vez por mês (embora tê-lo em um proc e agendamento seja menos trabalhoso no longo prazo) corre). Quão? O uso do SQLCLR para acessar a classe cuida de quase tudo para você (você pode definir o tamanho do lote, acionar ou não gatilhos, etc.). Ou, se você não quiser mexer na compilação e implantação de um Assembly, poderá usar um procedimento armazenado SQLCLR pré-criado, como DB_BulkCopy, que faz parte do SQL #
SqlBulkCopy
classe no .NET, ela é essencialmente o BCP sem todo o barulho de chamar o BCP. Você pode codificar isso sozinho: não há uma configuração super complicada nem nada como oSqlBulkCopy
biblioteca SQLCLR (da qual sou o autor, mas que está armazenado). procedimento está na versão gratuita). Descrevo isso com mais detalhes, incluindo um exemplo do uso de DB_BulkCopy , na seguinte resposta:Importar dados de um banco de dados para outro script
Se não estiver claro onde colocar isso em seu plano atual, faça o seguinte:
EXEC
de DB_BulkCopy ou o que você chamar, se você codificar por si mesmo, que apenas move os dados do ponto A para o ponto B.Além disso, deve-se salientar que
SqlBulkCopy
e DB_BulkCopy :ATUALIZAÇÃO sobre operações registradas minimamente via SqlBulkCopy
É possível obter operações minimamente registradas, mas você deve saber:
[tempdb]
e depois faça a inserção ordenada no destino. Portanto, há uma carga adicional incorrida, tanto em termos de E / S física para tempdb (arquivos de dados e log) quanto na operação de classificação (devido aoORDER BY
que é necessário para obter as operações minimamente registradas)fonte