Não convergência quando o SQL Server processos pai e filho em lotes de geração separados

Este artigo ajuda você a resolver o problema de não convergência que ocorre quando SQL Server as gerações filho e pai em lotes de geração separados.

Versão original do produto:   SQL Server
Número KB original:   308266

Sintomas

Uma perda de comandos INSERT em tabelas filho em um assinante pode ocorrer sob as seguintes condições:

  • A topologia de replicação de mesclagem é hierárquica, com um editor, um ou mais republicadores e um ou mais assinantes.
  • Um ou mais artigos pai e filho existem em uma publicação de replicação de mesclagem, com um filtro de junção definido entre eles.
  • Existe uma restrição de chave estrangeira no republicador e assinante para a NOT FOR REPLICATION relação entre esses dois artigos.
  • INSERTs em um artigo filho ocorrem em uma geração separada de sua geração pai associada por mais do que o valor especificado no parâmetro -DownloadGenerationsPerBatch de agente de mesclagem. Assim, o agente de mesclagem processa a geração filha em um lote de gerações separado de sua geração pai associada.
  • Há uma interrupção do processamento de mesclagem entre o editor e o republicador e entre o processamento dos lotes de geração filho e pai.

Solução alternativa

A arquitetura de replicação de mesclagem não fornece um mecanismo para manter as alterações pai e filho juntas entre os limites de lotes de geração. Para resolver esse problema, você pode:

  • Aumente os parâmetros e Merge Agent para o valor máximo de -UploadGenerationsPerBatch 2000, o que praticamente elimina a possibilidade de processar a geração de um artigo filho em um lote separado da geração do artigo -DownloadGenerationsPerBatch pai.

-OU-

  • Remova a NOT FOR REPLICATION propriedade nas restrições de chave estrangeira no republicador. Nesse caso, o Agente de Mesclagem não é capaz de inserir linhas no artigo filho porque não há linhas de artigo pai associadas. No entanto, lembre-se de que pode haver degradação de desempenho associada a essa alteração. Se o Agente de Mesclagem não puder inserir essas linhas filho, essas alterações devem ser recuperadas. O processo de nova tentativa do Agente de Mesclagem é muito menos eficiente do que seu modo normal de processamento em lotes.

Mais informações

Aqui está uma sequência mais detalhada de eventos nos quais esse problema pode ocorrer. Os valores padrão para os -UploadGenerationsPerBatch -DownloadGenerationsPerBatch parâmetros e Merge Agent (que suportam fortemente esse problema) são 100. No exemplo a seguir, suponha que os -UploadGenerationsPerBatch parâmetros e -DownloadGenerationsPerBatch não foram alterados.

  • InSERTs ocorrem no editor de nível superior em um filho e um artigo pai. Um artigo filho é qualquer artigo em uma publicação que tenha uma restrição de chave estrangeira para outra tabela, chamado de artigo pai. Esses dois artigos estão relacionados por um filtro de junção de replicação de mesclagem e as restrições reais de chave externa do servidor no republicador e assinante são marcadas com a propriedade NOT FOR REPLICATION. Você pode executar o procedimento sp_help armazenado nas tabelas para determinar se as restrições não são para replicação, se você não tiver certeza.
  • Os INSERTs na tabela filho ocorrem (por exemplo) na geração 110. Os INSERTs na tabela pai ocorrem (por exemplo) na geração 250. A separação entre essas gerações é maior do que o -DownloadGenerationsPerBatch parâmetro.
  • O Agente de Mesclagem do editor-republicador processa o lote de gerações que contêm gerações de 101 a 200. Após o processamento bem-sucedido desse lote e um download das alterações associadas nessas gerações para o republicador, o Agente de Mesclagem do publisher-republisher é interrompido. A interrupção ocorre antes que o Agente de Mesclagem possa processar as gerações de 201 a 300 (contendo as alterações do artigo pai). A interrupção pode ser devido à perda de conectividade de rede, um tempo de tempo de consulta e assim por diante. O Agente de Mesclagem pode comprometer as linhas de artigo filho sem as linhas pai porque a restrição de chave externa do lado do servidor é marcada como NOT FOR REPLICATION, "suspendendo" a verificação da restrição.
  • Antes que o Agente de Mesclagem do publisher-republiclisher comece a processar novamente, o Agente de Mesclagem do assinante republicador inicia uma sessão de mesclagem. Ele inicia o processo de download de alterações do republicador.
  • Quando o Agente de Mesclagem do assinante republicador processa a geração 110 (o artigo filho INSERTs), ele avalia o filtro de junção presente entre o artigo filho e o artigo pai. Como as alterações do artigo pai ainda não chegaram ao republicador, o Agente de Mesclagem determina que esses INSERTs filho não "qualificam" o filtro de junção. O Agente de Mesclagem baixa a linha MSmerge_genhistory que representa a geração 110, mas nenhuma das alterações nessa geração. Este Agente de Mesclagem conclui sua sessão com êxito.
  • Uma sequência subsequente do Agente de Mesclagem entre o editor e o republicador processa com êxito o lote de gerações que contêm o artigo pai INSERTs (gerações 201 a 300) e confirma essas alterações no republicador.
  • Por fim, uma sessão subsequente do Agente de Mesclagem entre o republicador e o assinante considera a geração 250 e baixa os INSERTs do artigo pai para o assinante. No entanto, como o assinante também sabe a geração 110 (a geração do artigo filho), o Agente de Mesclagem não avalia a partição do artigo filho.

Isso resulta nas linhas corretas do artigo pai que estão presentes no assinante com linhas filho no orphaned republicador.