Cómo se realiza el seguimiento y la enumeración de los cambios en la réplica de mezcla

Una vez inicializada una publicación o suscripción, la réplica de mezcla realiza el seguimiento y la enumeración de todos los cambios efectuados en los datos de las tablas publicadas. El seguimiento de los cambios se realiza a través de desencadenadores (que la réplica crea para cada tabla publicada) y tablas del sistema de las bases de datos de suscripciones y publicaciones. Estas tablas del sistema de réplica se llenan con metadatos que indican qué cambios deben propagarse. Cuando el Agente de mezcla se ejecuta durante la sincronización, enumera los cambios y éstos se aplican al publicador y suscriptor según sea necesario.

Seguimiento de los cambios

La réplica de mezcla utiliza los siguientes desencadenadores y tablas del sistema para realizar un seguimiento de los cambios en todas las tablas publicadas:

  • MSmerge_ins_<GUID>: desencadenador de inserción (el valor GUID para éste y los demás desencadenadores deriva de sysmergearticles)

  • MSmerge_upd_<GUID>: desencadenador de actualización

  • MSmerge_del_<GUID>: desencadenador de eliminación

  • MSmerge_contents

  • MSmerge_tombstone

  • MSmerge_genhistory

La réplica de mezcla utiliza las siguientes tablas del sistema adicionales para realizar un seguimiento de los cambios en las tablas filtradas:

  • MSmerge_partition_groups

  • MSmerge_current_partition_mappings

  • MSmerge_past_partition_mappings

[!NOTA]

Las tablas del sistema incluidas en la lista se utilizan en todas las publicaciones y suscripciones de mezcla de una base de datos; por ejemplo, si tiene más de una publicación en una base de datos de publicaciones, MSmerge_contents contiene filas de los artículos de todas las publicaciones.

Seguimiento de los cambios para tablas sin filtrar

Tablas del sistema

Las tablas del sistema utilizadas para tablas filtradas y sin filtrar contienen los siguientes metadatos:

  • MSmerge_contents contiene una fila por cada fila insertada o actualizada de una tabla publicada en la base de datos.

  • MSmerge_tombstone contiene una fila para cada fila eliminada de una tabla publicada en la base de datos.

  • MSmerge_genhistory contiene una fila por cada generación. Una generación es un conjunto de cambios que se entregan a un publicador o suscriptor. Las generaciones se cierran cada vez que se ejecuta el Agente de mezcla; los cambios posteriores en una base de datos se agregan a una o varias generaciones abiertas.

Proceso de seguimiento de los cambios

Se utiliza el siguiente proceso de seguimiento de los cambios para todas las tablas sin filtrar:

  • Cuando se produce una inserción o actualización en una tabla publicada, el desencadenador MSmerge_ins_<GUID> o MSmerge_upd_<GUID> se activa, y se inserta una fila en la tabla del sistema MSmerge_contents. La columna rowguid de MSmerge_contents contiene el valor GUID para la fila insertada o actualizada, lo que indica que la próxima vez que se produzca la sincronización, la correspondiente fila insertada o actualizada en la tabla de usuario deberá ser enviada al publicador o los suscriptores. Si se producen actualizaciones posteriores en una fila de una tabla de usuario, la fila de MSmerge_contents se actualiza para reflejar dicha situación.

  • Cuando se produce una eliminación en una tabla publicada, el desencadenador MSmerge_del_<GUID> se activa y se inserta una fila en la tabla del sistema MSmerge_tombstone. La columna rowguid de MSmerge_tombstone contiene el valor GUID para la fila eliminada, lo que indica que la próxima vez que se produzca la sincronización, deberá enviarse al publicador o a los suscriptores una eliminación para la correspondiente fila eliminada de la tabla de usuario. Si se hace referencia a la fila eliminada en MSmerge_contents (porque haya sido insertada o actualizada desde la última sincronización), la fila se elimina de MSmerge_contents.

Seguimiento de los cambios para tablas filtradas

Tablas del sistema

Además de las tablas del sistema descritas en la sección anterior, tres tablas de la base de datos de publicaciones contienen metadatos para realizar un seguimiento de los cambios en las tablas filtradas:

  • MSmerge_partition_groups contiene una fila para cada partición definida en una publicación. Las particiones pueden:

    • Definirse explícitamente mediante sp_addmergepartition o la página Particiones de datos del cuadro de diálogo Propiedades de la publicación.

    • Crearse automáticamente cuando un suscriptor se sincroniza, si el suscriptor requiere una partición que todavía no tenga una entrada en MSmerge_partition_groups.

  • MSmerge_current_partition_mappings contiene una fila para cada combinación de filas única de MSmerge_contents y MSmerge_partition_groups. Por ejemplo, si una fila de una tabla de usuario pertenece a dos particiones y la fila se actualiza, se inserta una fila en MSmerge_contents para reflejar la actualización, y se insertan dos filas en MSmerge_current_partition_mappings para indicar que la fila actualizada pertenece a las dos particiones.

  • MSmerge_past_partition_mappings contiene una fila para cada fila que ha dejado de pertenecer a una partición determinada. Una fila sale de una partición si:

    • La fila se elimina. Si se elimina una fila de una tabla de usuario, se inserta una fila en MSmerge_tombstone y una o varias filas en MSmerge_past_partition_mappings.

    • El valor de una columna utilizada para filtrar ha cambiado. Por ejemplo, si un filtro con parámetros se basa en el estado en el que una empresa tiene las oficinas centrales y la empresa se traslada, la fila de la empresa (y las filas relacionadas de otras tablas) pueden pasar de la partición de datos de un vendedor a la partición de otro. Si se actualiza una fila que ha dejado de pertenecer a una partición, se inserta o actualiza una fila en MSmerge_contents y se insertan una o varias filas en MSmerge_past_partition_mappings.

[!NOTA]

Si se utilizan particiones no superpuestas con una suscripción por partición (un valor de 3 para el parámetro @partition_options de sp_addmergearticle), las tablas del sistema MSmerge_current_partition_mappings y MSmerge_past_partition_mappings no se utilizan para realizar un seguimiento de las asignaciones de particiones de las filas, ya que cada fila pertenece a una sola partición y se puede cambiar en un solo suscriptor.

Proceso de seguimiento de los cambios

El proceso descrito anteriormente (en la sección "Seguimiento de los cambios para tablas sin filtrar") para las tablas sin filtrar se utiliza también para las tablas filtradas, con las siguientes adiciones:

  • Cuando se produce una inserción en una tabla publicada, además de la actualización o inserción de los datos en MSmerge_contents, se agrega una asignación de particiones a MSmerge_current_partition_mappings para cada una de las particiones a las que pertenece la fila.

  • Cuando se produce una actualización en una tabla publicada, además de la actualización o inserción de los datos en MSmerge_contents, se agrega una asignación de particiones para cada una de las particiones a las que pertenece la fila si no existe ninguna asignación en MSmerge_current_partition_mappings. Si la actualización ha provocado que una fila se mueva de una partición a otra, se actualiza una fila en MSmerge_current_partition_mappings y se agrega otra a MSmerge_past_partition_mappings.

  • Cuando se produce una eliminación en una tabla publicada, además de insertarse una fila en MSmerge_tombstone, se elimina una fila de MSmerge_current_partition_mappings y se agrega otra a MSmerge_past_partition_mappings.

Enumeración de los cambios

Procedimientos y tablas del sistema

Cuando se ejecuta el Agente de mezcla, los cambios se enumeran utilizando una serie de tablas del sistema y procedimientos almacenados:

  • MSmerge_genhistory contiene una fila por cada generación. Una generación es un conjunto de cambios que se entregan a un publicador o suscriptor. Las generaciones se cierran cada vez que se ejecuta el Agente de mezcla; los cambios posteriores en una base de datos se agregan a una o varias generaciones abiertas.

  • sysmergesubscriptions contiene información sobre suscripciones, incluido un registro de las últimas generaciones de cambios que un nodo ha enviado y recibido. En la base de datos de publicaciones, esta tabla contiene una fila para el publicador y otra para el suscriptor. En una base de datos de suscripciones, esta tabla normalmente contiene una fila para el publicador y otra para el suscriptor.

  • MSmerge_generation_partition_mappings se utiliza sólo para tablas filtradas y registra si una generación determinada contiene algún cambio relevante para una partición determinada. Esta tabla de la base de datos de publicaciones contiene una fila para cada combinación única de filas de MSmerge_genhistory y MSmerge_partition_groups.

  • sp_MSmakegeneration cierra todas las generaciones abiertas al comienzo del proceso de enumeración.

  • sp_MSenumchanges enumera los cambios de las tablas (en este proceso se utilizan también una serie de procedimientos relacionados cuyos nombres empiezan por sp_MSenumchanges).

  • sp_MSgetmetadata determina si un cambio de un nodo debe aplicarse a otro como inserción, actualización o eliminación.

Proceso de enumeración de los cambios

Se produce el siguiente proceso durante la enumeración de cambios:

  1. Se llama al procedimiento del sistema sp_MSmakegeneration:

    • Para tablas filtradas y sin filtrar, este procedimiento cierra todas las generaciones abiertas a las que se hace referencia en MSmerge_genhistory (las generaciones cerradas tienen un valor de 1 ó 2 en la columna genstatus).

    • Para las tablas filtradas, este procedimiento llena la tabla del sistema MSmerge_generation_partition_mappings. Si una generación contiene uno o varios cambios relevantes para una partición, se inserta una fila en la tabla del sistema. Si una generación no contiene ningún cambio relevante para una partición determinada, no se inserta ninguna fila en MSmerge_generation_partition_mappings y los cambios no se enumeran para ningún suscriptor que reciba dicha partición.

  2. Se llama al procedimiento almacenado sp_MSenumchanges y los procedimientos relacionados. Estos procedimientos enumeran los cambios que se han producido desde que tuvo lugar la última sincronización:

    1. Los procedimientos determinan primero la generación en la que comienza la enumeración, basándose en las columnas sentgen (última generación enviada) y recgen (última generación recibida) de la tabla sysmergesubscriptions.

      Por ejemplo, al determinar los cambios de las generaciones que deben enumerarse para un suscriptor determinado, se comparan sentgen para el suscriptor (almacenado en la base de datos de publicaciones) y recgen para el suscriptor (almacenado en la base de datos de suscripciones). Si los valores son los mismos (lo que indica que la última generación enviada desde el publicador ha sido recibida correctamente por el suscriptor), los cambios se enumeran empezando por la siguiente generación de MSmerge_genhistory. Si los valores no son los mismos, el menor de los dos se utiliza para garantizar que se envían todos los cambios necesarios.

    2. A continuación, los procedimientos enumeran los cambios:

      Para las tablas sin filtrar, se enumeran todos los cambios contenidos en las generaciones tras la generación en sentgen o recgen: MSmerge_genhistory se combina con MSmerge_contents y MSmerge_tombstone para determinar los cambios que se deben enviar.

      Para las tablas filtradas, MSmerge_generation_partition_mappings se combina con: MSmerge_current_partition_mappings y MSmerge_contents; y con MSmerge_past_partition_mappings y MSmerge_tombstone para determinar los cambios que son relevantes para la partición que el suscriptor recibe.

  3. Se llama al procedimiento almacenado sp_MSgetmetadata para determinar si un cambio debe aplicarse como una inserción, una actualización o una eliminación. En este momento se lleva a cabo la detección y resolución de conflictos. Para obtener más información, vea Cómo la replicación de mezcla detecta y resuelve conflictos.