Compartilhar via


Como a replicação por mesclagem rastreia e enumera alterações

Depois que uma publicação ou assinatura é inicializada, a replicação de mesclagem rastreia e enumera todas as alterações nos dados nas tabelas publicadas. As alterações são controladas por meio de gatilhos (que a replicação cria para cada tabela publicada) e tabelas do sistema nos bancos de dados de publicação e de assinatura. Essas tabelas do sistema de replicação são preenchidas com metadados que indicam quais alterações devem ser propagadas. Quando o Merge Agent é executado durante a sincronização, as alterações são enumeradas pelo agente e aplicadas ao Publicador e ao Assinante, conforme necessário.

Controle de alterações

A replicação de mesclagem usa os seguintes gatilhos e tabelas do sistema para controlar as alterações de todas as tabelas publicadas:

  • MSmerge_ins_<GUID>: gatilho de inserção (o valor GUID para esse gatilho e os outros gatilhos são derivados de sysmergearticles)
  • MSmerge_upd_<GUID>: gatilho de atualização
  • MSmerge_del_<GUID>: excluir gatilho
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

A replicação de mesclagem usa as seguintes tabelas extras do sistema para controlar as alterações das tabelas filtradas:

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

Observação

As tabelas do sistema listadas são utilizadas por todas as publicações e assinaturas de mesclagem em um banco de dados. Por exemplo, se você tiver mais de uma publicação em um banco de dados de publicação, MSmerge_contents incluirá linhas de artigos de todas as publicações.

Controle de alterações para tabelas não filtradas

Tabelas do sistema

As tabelas do sistema usadas para tabelas não filtradas e filtradas contêm os seguintes metadados:

  • MSmerge_contents contém uma linha para cada linha inserida ou atualizada em uma tabela publicada no banco de dados.

  • MSmerge_tombstone contém uma linha para cada linha excluída de uma tabela publicada no banco de dados.

  • MSmerge_genhistory contém uma linha para cada geração. Uma geração é um conjunto de alterações que é entregue para um Publicador ou Assinante. As gerações são fechadas sempre que o Merge Agent é executado; alterações subsequentes em um banco de dados são adicionadas a uma ou mais gerações abertas.

Processo de controle de alterações

O seguinte processo de controle de alterações é usado para todas as tabelas não filtradas:

  • Quando uma inserção ou atualização ocorre em uma tabela publicada, o gatilho MSmerge_ins_<GUID> ou MSmerge_upd_<GUID> dispara, e uma linha é inserida na tabela de sistema MSmerge_contents. A coluna rowguid de MSmerge_contents contém o GUID da linha inserida ou atualizada, indicando que na próxima vez que a sincronização ocorrer, a linha inserida ou atualizada correspondente na tabela de usuários deverá ser enviada ao Editor ou a Assinantes. Se ocorrerem atualizações subsequentes em uma linha em uma tabela de usuário, a linha em MSmerge_contents será atualizada para refletir esse estado.

  • Quando ocorre uma exclusão em uma tabela publicada, o gatilho MSmerge_del_<GUID> é acionado, e uma linha é inserida na tabela do sistema MSmerge_tombstone. A coluna rowguid de MSmerge_tombstone contém o GUID da linha excluída, indicando que na próxima vez que a sincronização ocorrer, uma exclusão deverá ser enviada ao Editor ou a Assinantes para a linha excluída correspondente na tabela de usuários. Se a linha excluída for referenciada em MSmerge_contents (porque foi inserida ou atualizada desde a última sincronização), a linha será excluída de MSmerge_contents.

Controle de alterações para tabelas filtradas

Tabelas do sistema

Além das tabelas do sistema descritas na seção anterior, três tabelas no banco de dados de publicação contêm metadados para controlar alterações em tabelas filtradas:

  • MSmerge_partition_groups contém uma linha para cada partição definida em uma publicação. As partições podem ser:

    • Definido explicitamente usando sp_addmergepartition ou a página Partições de Dados da caixa de diálogo Propriedades da Publicação.

    • Criado automaticamente quando um Assinante sincroniza, se o Assinante precisar de uma partição que ainda não possui uma entrada em MSmerge_partition_groups.

  • MSmerge_current_partition_mappings contém uma linha para cada combinação exclusiva de linhas dentro MSmerge_contents e MSmerge_partition_groups. Por exemplo, se uma linha em uma tabela de usuário pertencer a duas partições e a linha for atualizada, uma linha será inserida MSmerge_contents para refletir a atualização e duas linhas serão inseridas MSmerge_current_partition_mappings, para indicar que a linha atualizada pertence às duas partições.

  • MSmerge_past_partition_mappings contém uma linha para cada linha que não pertence mais a uma determinada partição. Uma linha sairá de uma partição se:

    • A linha é excluída. Se uma linha for excluída de uma tabela de usuário, uma linha será inserida MSmerge_tombstone e uma ou mais linhas serão inseridas MSmerge_past_partition_mappings.

    • O valor em uma coluna usada para filtragem foi alterado. Por exemplo, se um filtro parametrizado for baseado no estado em que uma empresa está sediada, e a empresa mudar de sede, a linha da empresa (e linhas relacionadas em outras tabelas) poderá sair da parte dos dados de um vendedor para a parte de outro vendedor. Se uma linha for atualizada de modo que ela não pertença mais a uma partição, uma linha será inserida ou atualizada MSmerge_contents e uma ou mais linhas serão inseridas MSmerge_past_partition_mappings.

Observação

Se partições não sobrepostas com uma assinatura por partição (um valor de 3 para o parâmetro de @partition_options sp_addmergearticle) forem usadas, as tabelas MSmerge_current_partition_mappings e MSmerge_past_partition_mappings do sistema não serão usadas para acompanhar os mapeamentos de partição das linhas, pois cada linha pertence a apenas uma partição e pode ser alterada em apenas um Assinante.

Processo de controle de alterações

O processo descrito anteriormente (na seção Controle de alterações para tabelas não filtradas) para tabelas não filtradas também é usado para tabelas filtradas, com as seguintes adições:

  • Quando uma inserção ocorre em uma tabela publicada, além de os dados serem atualizados ou inseridos no MSmerge_contents, um mapeamento de partição é adicionado no MSmerge_current_partition_mappings para cada partição à qual a linha pertence.

  • Quando ocorre uma atualização em uma tabela publicada, além de os dados serem atualizados ou inseridos em MSmerge_contents, se não existir um mapeamento de partição em MSmerge_current_partition_mappings para cada partição à qual a linha pertence, um mapeamento será adicionado. Se a atualização resultou em uma linha sendo movida de uma partição para outra, uma linha será atualizada MSmerge_current_partition_mappings e uma será adicionada a MSmerge_past_partition_mappings.

  • Quando ocorre uma exclusão em uma tabela publicada, além de uma linha ser inserida em MSmerge_tombstone, uma linha ser excluída de MSmerge_current_partition_mappings e uma linha ser adicionada a MSmerge_past_partition_mappings.

Alterar enumeração

Tabelas e procedimentos do sistema

Quando o Merge Agent é executado, as alterações são enumeradas usando várias tabelas do sistema e procedimentos armazenados:

  • MSmerge_genhistory contém uma linha para cada geração. Uma geração é um conjunto de alterações que é entregue para um Publicador ou Assinante. As gerações são fechadas sempre que o Merge Agent é executado; alterações subsequentes em um banco de dados são adicionadas a uma ou mais gerações abertas.

  • sysmergesubscriptions contém informações sobre assinaturas, incluindo um registro das últimas gerações de alterações que um nó enviou e recebeu. No banco de dados de publicação, essa tabela contém uma linha para o Publicador e uma linha para cada Assinante. Em um banco de dados de assinatura, essa tabela normalmente contém uma linha para o Assinante e uma linha para o Publicador.

  • MSmerge_generation_partition_mappings é usado apenas para tabelas filtradas, registrando se uma determinada geração contém alterações relevantes para uma determinada partição. Esta tabela no banco de dados de publicação contém uma linha para cada combinação exclusiva de linhas em MSmerge_genhistory e MSmerge_partition_groups.

  • sp_MSmakegeneration fecha todas as gerações abertas no início do processo de enumeração.

  • sp_MSenumchanges Enumera alterações para tabelas (vários procedimentos relacionados com os quais os nomes começam sp_MSenumchanges também são usados nesse processo).

  • sp_MSgetmetadata determina se uma alteração de um nó deve ser aplicada em outro nó como uma inserção, atualização ou exclusão.

Alterar o processo de enumeração

O processo a seguir ocorre durante a enumeração de mudanças:

  1. O procedimento sp_MSmakegeneration do sistema é chamado:

    • Para tabelas não filtradas e filtradas, esse procedimento fecha todas as gerações abertas referenciadas MSmerge_genhistory (as gerações fechadas têm um valor de 1 ou 2 na coluna genstatus).

    • Para tabelas filtradas, este procedimento preenche a tabela MSmerge_generation_partition_mappingsdo sistema. Se uma geração contiver uma ou mais alterações relevantes para uma partição, uma linha será inserida na tabela do sistema. Se uma geração não contiver alterações relevantes para uma determinada partição, uma linha não será inserida em MSmerge_generation_partition_mappings, e as alterações não serão enumeradas para nenhum assinante que receba essa partição.

  2. O procedimento armazenado sp_MSenumchanges e os procedimentos relacionados são chamados. Esses procedimentos enumeram as alterações que ocorreram desde a última vez em que a sincronização ocorreu:

    1. Os procedimentos primeiro determinam a geração na qual a enumeração é iniciada, com base nas colunas sentgen (última geração enviada) e recgen (última geração recebida) na tabela sysmergesubscriptions.

      Por exemplo, ao determinar quais alterações de gerações devem ser enumeradas para um determinado Assinante, o sentgen do Assinante (armazenado no banco de dados de publicação) e o recgen do Assinante (armazenado no banco de dados de assinatura) são comparados. Se os valores forem os mesmos (o que indica que a última geração enviada do Publicador foi recebida com êxito pelo Assinante), as alterações serão enumeradas a partir da próxima geração em MSmerge_genhistory. Se os valores não forem os mesmos, a parte inferior dos dois valores será usada para garantir que todas as alterações necessárias sejam enviadas.

    2. Em seguida, os procedimentos enumeram alterações:

      Para tabelas não filtradas, todas as alterações contidas em gerações após a geração em sentgen ou recgen são enumeradas: MSmerge_genhistory é unida a MSmerge_contents e MSmerge_tombstone para determinar quais alterações devem ser enviadas.

      Para tabelas filtradas, MSmerge_generation_partition_mappings é unida a: MSmerge_current_partition_mappings e MSmerge_contents; e MSmerge_past_partition_mappings e MSmerge_tombstone para determinar quais alterações são relevantes para a partição que o Assinante recebe.

  3. O procedimento sp_MSgetmetadata armazenado é chamado para determinar se uma alteração deve ser aplicada como uma inserção, atualização ou exclusão. Neste ponto, a detecção e a resolução de conflitos são executadas; para obter mais informações, consulte Como a replicação de mesclagem detecta e resolve conflitos.