Usando a replicação transacional do SQL 2008 R2 com assinantes pull, quando adicionamos um artigo, eu gostaria de evitar a criação de um instantâneo inteiro (o banco de dados é de ~ 80 GB, isso leva horas).
A partir deste artigo , eu vi como fazer isso com um instantâneo parcial definindo immediate_sync fora, mas isso não funcionou para nós.
Idealmente, eu gostaria de executar isso como parte do nosso script db para criar a tabela; portanto, se quisermos replicá-lo, faremos:
Create Table ...
sp_addArticle ...
sp_PushThisToOurSubscribersNow
fonte
fonte
Eu tinha a mesma pergunta e, mesmo sendo um DBA há algum tempo, não lidei com a replicação com profundidade suficiente para me sentir completamente confortável com ela, então pensei que os seguintes recursos e guias eram úteis:
Este blog , que forneceu um bom esboço do processo. Ele também nos lembra que, se você tiver uma publicação grande e sua opção estiver definida como "Instant_sync", fará com que um instantâneo totalmente novo seja preparado toda vez que você adicionar ou alterar um artigo. Então ele tem uma dica útil para mudar essa opção, usando
sp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';
Postagem do blog do MSDN em "repltalk" (soa como um bom recurso em geral!) - não "diretamente diretamente", mas ainda sendo útil
Esta pergunta, onde @ Brandon-Williams apontou que, se for uma assinatura Pull , você também deve atualizá-la usando
sp_refreshSubscriptions @publication = 'MyPub'
Monitor de replicação SSMS - maneira conveniente de parar e iniciar os agentes (instantâneo, leitor de log) ao seguir o guia.
Aqui estão as etapas reais que segui, que funcionaram bem e alcançaram a aprovação do meu DBA supervisor:
sp_changePublication
- yes, como @cody_konior aponta, isso está sub-documentado, mas funcionou bem no meu caso. YMMVsp_addArticle
sp_articleColumn
(publicação e artigo especificados, NÃO especificar colunas -> implica TODAS as colunas)sp_refreshSubscriptions
para essa publicação para atualizar o extratorE, embora sim, você poderia fazer a maioria das alterações com a GUI do SSMS, acho útil escrever tudo para que possa ser A) sob controle de origem (controle de mudança) e B) implantado repetidamente ou em várias instâncias . Infelizmente, não dediquei tempo ao script do Agente para / inicia, mas isso não deve ser muito difícil, pois são apenas trabalhos do SQL Agent. Você só precisa fazer todo esse truque "encontrar o JobID usando o Job-Name" (consulta
sysjobs
- realmente, MS?) ...Espero que ajude futuros leitores!
fonte
Conforme observado em Adicionando artigos a e descartando artigos de publicações existentes , você deve * criar um novo instantâneo para a publicação.
Para evitar a geração de um instantâneo para todos os artigos ao adicionar um novo artigo, propriedade publicação
immediate_sync
deve ser definido como 0. Chamadasp_addarticle
, entãosp_addsubscription
. Se as assinaturas forem recebidas, você também deverá ligarsp_refreshsubscriptions
. Em seguida, gere um instantâneo e apenas um instantâneo para o artigo adicionado recentemente será gerado.* Essa é a abordagem recomendada nos Manuais Online do SQL Server. O problema com sua abordagem é que ela é propensa a erros.
fonte
Edição principal Esta é uma reescrita completa desta resposta (levando em consideração críticas válidas de que a versão anterior era propensa a erros e causaria problemas)
Também postou uma demonstração de como aplicar isso ao: Youtube - Replicação do SQL Server: como adicionar um artigo sem tirar uma captura instantânea .
IMPORTANTE: Esta NÃO é uma abordagem recomendada da Microsoft; portanto, você estará por conta própria em fazê-lo funcionar. NÃO se aplique diretamente ao seu ambiente de produção sem testes isolados significativos e se familiarize com as etapas!
Passos a seguir:
Verificar:
EXEMPLO Processo
A) Crie uma tabela para seu editor:
B) Crie um job / proc / script para fazer algumas inserções / atualizações / exclusões em [TableNotUsingSnap] (você pode usá-lo para validar como o assinante é sincronizado corretamente usando esse método.
Pré-etapas:
1. Crie sua tabela no assinante
2. Crie seus procedimentos armazenados de replicação (atualização / inserção / exclusão) - no Assinante
Você pode criar os procs de repl:
A alteração que você precisará aplicar:
IF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1)
para não inserir se já estiver láIF @@rowcount = 0 ... exec sp_MSreplraiserror ...
para ignorar uma atualização que não é aplicada (pois o registro pode ter sido excluído no editor antes de você sincronizar os dados)IF @@rowcount = 0 ... exec sp_MSreplraiserror ...
para ignorar uma exclusão que não é aplicada (como o registro pode ter sido excluído no editor antes de você sincronizar os dados)sp_MSins_dboTableNotUsingSnap:
sp_MSupd_dboTableNotUsingSnap:
sp_MSdel_dboTableNotUsingSnap:
ETAPAS DE IMPLANTAÇÃO
3. Pare o agente de distribuição - No distribuidor (push) ou no assinante (pull)
4. Agora adicione o artigo à publicação - No Publicador
Parâmetros principais:
sp_addarticle
-@pre_creation_cmd = N'none'
usado para dizer ao Agente de distribuição para não deixar cair e gerar seus próprios objetossp_addsubscription
-@sync_type = N'none'
usado para dizer ao Distribuidor que ele não precisa criar um novo instantâneo, ele pode apenas enfileirar os comandos do DIUsp_addarticle:
5. Sincronize seus dados
Agora você precisa copiar seus dados para o assinante, você pode:
O método exato que você usar eu deixo para o leitor, também dependerá de quanto tempo você estiver disposto a parar o seu Agente de Distribuição.
EXTRA: Como uma etapa adicional em seus testes, aqui está um bom local para executar seu script (da Etapa (B)) para criar ações de DIU em [TableNotUsingSnap] para que você possa ganhar confiança nesse método.
6. Reinicie o agente de distribuição - No Distribuidor (Push) ou Assinante (Pull)
fonte