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

Após uma assinatura ou publicação ter sido inicializada, a replicação de mesclagem rastreia e enumera todas as alterações nos dados das tabelas publicadas. As alterações são rastreadas por meio de gatilhos (que a replicação cria para cada tabela publicada) e tabelas de sistema nos bancos de dados de publicação e assinatura. Estes tabelas do sistema de replicação são populadas com metadados que indicam quais alterações deveriam ser propagadas. Quando o Merge Agent executa durante a sincronização, as alterações são enumeradas pelo agente e, em seguida, aplicadas ao Assinante e ao Publicador conforme necessário.

Rastreamento de alterações

A replicação de mesclagem usa os gatilhos e as tabelas de sistema a seguir para rastrear alterações para todas as tabelas publicadas:

  • MSmerge_ins_<GUID>: gatilho de inserção (o valor GUID para este e outros gatilhos são derivados de sysmergearticles)

  • MSmerge_upd_<GUID>: gatilho de atualização

  • MSmerge_del_<GUID>: gatilho de exclusão

  • MSmerge_contents

  • MSmerge_tombstone

  • MSmerge_genhistory

A replicação de mesclagem usa as seguintes tabelas adicionais de sistema para rastrear as alterações para tabelas filtradas:

  • MSmerge_partition_groups

  • MSmerge_current_partition_mappings

  • MSmerge_past_partition_mappings

ObservaçãoObservação

As tabelas de sistema listadas são usadas por todas as publicações e assinaturas de mesclagem de um banco de dados; por exemplo, se você possui mais de uma publicação de um banco de dados de publicação, a MSmerge_contents contém linhas de artigos de todas as publicações.

Rastreamento 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:

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

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

  • A MSmerge_genhistory contém uma linha para cada geração. Uma geração é uma coleção de alterações entregues a um Publicador ou Assinante. As gerações são fechadas sempre que o Merge Agent for executado; as alterações subseqüentes de um banco de dados são adicionadas a uma ou mais gerações abertas.

Processo de rastreamento de alterações

O processo de rastreamento de alteração a seguir é usado para todas as tabelas não filtradas:

  • Quando uma inserção ou atualização ocorrer em uma tabela publicada, a MSmerge_ins_<GUID> ou MSmerge_upd_<GUID> aciona o gatilho e uma linha é inserida na tabela de sistema MSmerge_contents. A coluna rowguid da MSmerge_contents contém o GUID para a linha inserida ou atualizada, indicando que na próxima vez que a sincronização ocorrer, a linha inserida ou atualizada correspondente da tabela do usuário deve ser enviada para o Publicador ou Assinante. Se atualizações subseqüentes ocorrerem em uma linha de uma tabela de usuário, a linha na MSmerge_contents será atualizada para refletir isso.

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

Rastreamento de alterações para tabelas filtradas

Tabelas do sistema

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

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

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

    • Criadas automaticamente quando um Assinante sincroniza se este requer uma partição que ainda não possui uma entrada na MSmerge_partition_groups.

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

  • A MSmerge_past_partition_mappings contém uma linha para cada linha que já não pertence a uma determinada partição. Uma linha se muda 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 na MSmerge_tombstone e uma ou mais linhas serão inseridas na MSmerge_past_partition_mappings.

    • O valor de uma coluna usada para filtragem foi alterado. Por exemplo, se um filtro com parâmetros estiver baseado no estado em que uma empresa estiver sediada e a empresa se mudar, a linha da empresa (e as linhas relacionadas em outras tabelas) pode se mudar da partição de dados de uma pessoa de vendas para a partição de outra pessoa de vendas. Se uma linha for atualizada de modo que ela não pertença mais a uma partição, uma linha será inserida ou atualizada na MSmerge_tombstone e uma ou mais linhas serão inseridas na MSmerge_past_partition_mappings.

ObservaçãoObservação

Se não houver partições sobrepostas com uma assinatura por partição (um valor de 3 para o parâmetro @partition_options de sp_addmergearticle) será utilizado, as tabelas de sistemaMSmerge_current_partition_mappings e MSmerge_past_partition_mappings não são usadas para rastrear o mapeamento de partição das linhas, porque cada linha pertence somente a uma partição e pode ser alterada somente em um Assinante.

Processo de rastreamento de alterações

O processo descrito acima (na seção, “Rastreamento de alterações de tabelas não filtradas”) para tabelas não filtradas também são usados para tabelas filtradas com as seguintes adições:

  • Quando uma inserção ocorrer em uma tabela publicada, além dos dados atualizados ou inseridos na MSmerge_contents, um mapeamento de partição será adicionado à MSmerge_current_partition_mappings para cada partição a que a linha pertence.

  • Quando uma atualização ocorrer em uma tabela publicada, além dos dados atualizados ou inseridos na MSmerge_contents, se um mapeamento de partição não existir na MSmerge_current_partition_mappings para cada partição a que a linha pertencer, ele será adicionado. Se a atualização resultou em uma linha movida de uma partição para outra, uma linha será atualizada na MSmerge_current_partition_mappings e uma será adicionada na MSmerge_past_partition_mappings.

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

Enumeração de alterações

Tabelas e procedimentos do sistema

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

  • A MSmerge_genhistory contém uma linha para cada geração. Uma geração é uma coleção de alterações entregues a um Publicador ou Assinante. As gerações são fechadas sempre que o Merge Agent for executado e as alterações subseqüentes de um banco de dados são adicionadas a uma ou mais gerações abertas.

  • A 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, esta tabela contém uma linha para o Publicador e uma linha para cada Assinante. Em um banco de dados de assinatura, esta tabela normalmente contém uma linha para o Assinante e uma linha para o Publicador.

  • A MSmerge_generation_partition_mappings é usada somente para tabelas não filtradas, que registram se uma determinada geração contém qualquer alteração relevante 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.

  • A sp_MSmakegeneration fecha todas as gerações abertas no começo do processo de enumeração.

  • A sp_MSenumchanges enumera as alterações das tabelas (alguns procedimentos relacionados que têm nomes que começam por sp_MSenumchanges também são usados neste processo).

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

Processo de enumeração de alteração

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

  1. O procedimento de sistema sp_MSmakegeneration é chamado:

    • Para tabelas filtradas e não filtradas, este procedimento fechará todas as gerações abertas referenciadas em MSmerge_genhistory (as gerações fechadas possuem um valor 1 ou 2 na coluna genstatus).

    • Para tabelas filtradas, este procedimento popula a tabela de sistema MSmerge_generation_partition_mappings. Se a geração contiver uma ou mais alterações relevantes para uma partição, uma linha será inserida na tabela de sistema. Se uma geração não contiver alterações relevantes para uma determinada partição, uma linha será inserida na MSmerge_generation_partition_mappings e as alterações não serão enumeradas por qualquer Assinante que receber essa partição.

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

    1. Os procedimentos determinam inicialmente a geração na qual e enumeração inicia, 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 assinaturas) 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 são enumeradas iniciando com a geração seguinte em MSmerge_genhistory. Se os valores não forem os mesmos, o menor dos dois valores é usado para assegurar que todas as alterações requeridas foram enviadas.

    2. Os procedimentos enumeram, então, as alterações:

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

      Para as tabelas filtradas, MSmerge_generation_partition_mappings é unido 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 armazenado sp_MSgetmetadata é chamado para determinar se uma alteração deve ser aplicada como uma inserção, atualização ou exclusão. Neste momento, são executadas a detecção e solução de conflitos e a solução. Para obter mais informações, consulte Como a replicação de mesclagem detecta e soluciona conflitos.