Compartir a través de


Cómo la replicación de mezcla realiza un seguimiento de los cambios y los enumera

Después de inicializar una publicación o suscripción, la replicación de mezcla realiza un seguimiento y enumera todos los cambios realizados en los datos de las tablas publicadas. Se realiza un seguimiento de los cambios a través de desencadenadores (que la replicación crea para cada tabla publicada) y las tablas del sistema en las bases de datos de publicación y suscripción. Estas tablas del sistema de replicación se rellenan con metadatos que indican qué cambios se deben propagar. Cuando el Agente de mezcla se ejecuta durante la sincronización, el agente enumera los cambios y, a continuación, se aplica al publicador y al suscriptor según sea necesario.

Change Tracking

La replicación de mezcla usa los siguientes desencadenadores y tablas del sistema para realizar un seguimiento de los cambios en todas las tablas publicadas:

  • MSmerge_ins_<GUID>: insert trigger (el valor GUID para este desencadenador y los demás desencadenadores se derivan de sysmergearticles)
  • MSmerge_upd_<GUID>: desencadenador de actualización
  • MSmerge_del_<GUID>: se ha eliminado el desencadenador
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

La replicación de mezcla utiliza las siguientes tablas adicionales del sistema para hacer 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 enumeradas son usadas por todas las publicaciones y suscripciones mezcladas en 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 artículos en todas las publicaciones.

Seguimiento de cambios para tablas sin filtrar

Tablas del sistema

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

  • MSmerge_contents contiene una fila para cada fila insertada o actualizada en una tabla publicada de 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 para cada generación. Una generación es una colección 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 de una base de datos se agregan a una o varias generaciones abiertas.

Proceso de seguimiento de cambios

El siguiente proceso de seguimiento de cambios se usa para todas las tablas sin filtrar:

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

  • 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 GUID de la fila eliminada, lo que indica que la próxima vez que se produzca la sincronización, se debe enviar una eliminación al publicador o a los suscriptores para la fila eliminada correspondiente en la tabla de usuarios. Si se hace referencia a la fila eliminada en MSmerge_contents (porque se insertó o actualizó desde la última sincronización), la fila se elimina de MSmerge_contents.

Seguimiento de 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 publicación contienen metadatos para realizar el 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 ser:

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

    • Se crea automáticamente cuando un suscriptor se sincroniza si el suscriptor requiere una partición que aún no tiene una entrada en MSmerge_partition_groups.

  • MSmerge_current_partition_mappings contiene una fila para cada combinación única de filas en 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 dos filas se insertan 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 ya no pertenece 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 se insertan en MSmerge_past_partition_mappings.

    • El valor de una columna usada para el filtrado ha cambiado. Por ejemplo, si un filtro parametrizado se basa en el estado en el que tiene su sede una empresa y esta se traslada, la fila correspondiente a la empresa (y las filas relacionadas en otras tablas) podría pasar de la partición de datos de un comercial a la partición de otro comercial. Si se actualiza una fila de modo que ya no pertenece 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 usan 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 usan para realizar un seguimiento de las asignaciones de particiones de las filas, ya que cada fila pertenece a solo una partición y solo se puede cambiar en solo un Suscriptor.

Proceso de seguimiento de cambios

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

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

  • Cuando se produce una actualización en una tabla publicada, además de los datos que se actualizan o insertan en MSmerge_contents, si en MSmerge_current_partition_mappings no existe una asignación de particiones para cada partición a la que pertenece la fila, se agrega una. Si la actualización dio lugar a que una fila se moviera de una partición a otra, se actualiza una fila en MSmerge_current_partition_mappings y se agrega a MSmerge_past_partition_mappings.

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

Cambiar enumeración

Tablas y procedimientos del sistema

Cuando se ejecuta el Agente de mezcla, los cambios se enumeran mediante varias tablas del sistema y procedimientos almacenados:

  • MSmerge_genhistory contiene una fila para cada generación. Una generación es una colección 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 de una base de datos se agregan a una o varias generaciones abiertas.

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

  • MSmerge_generation_partition_mappings solo se usa para tablas filtradas, registrando si una generación determinada contiene cambios relevantes para una partición determinada. Esta tabla de la base de datos de publicación 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 principio del proceso de enumeración.

  • sp_MSenumchanges enumera los cambios de las tablas (varios procedimientos relacionados que tienen nombres que comienzan por sp_MSenumchanges también se usan en este proceso).

  • sp_MSgetmetadata determina si un cambio de un nodo se debe aplicar en otro nodo como inserción, actualización o eliminación.

Cambio del proceso de enumeración

El siguiente proceso se produce durante la enumeración de cambios:

  1. Al procedimiento sp_MSmakegeneration del sistema se le llama:

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

    • Para las tablas filtradas, este procedimiento rellena la tabla MSmerge_generation_partition_mappingsdel sistema . 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 una fila en MSmerge_generation_partition_mappingsy los cambios no se enumeran para ningún suscriptor que reciba esa partición.

  2. Se llaman al procedimiento almacenado sp_MSenumchanges y a los procedimientos relacionados. Estos procedimientos enumeran los cambios que se produjeron desde la última vez que se produjo la sincronización:

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

      Por ejemplo, al determinar qué cambios de las generaciones se deben enumerar para un suscriptor determinado, se comparan el sentgen del suscriptor (almacenado en la base de datos de publicación) y el recgen del suscriptor (almacenado en la base de datos de suscripción). Si los valores son los mismos (lo que indica que el Suscriptor recibió correctamente la última generación enviada desde el Publicador), los cambios se enumeran a partir de la próxima generación en MSmerge_genhistory. Si los valores no son los mismos, se usa la parte inferior de los dos valores para asegurarse de que se envían todos los cambios necesarios.

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

      Para las tablas sin filtrar, todos los cambios contenidos en las generaciones después de la generación en sentgen o recgen se enumeran: MSmerge_genhistory se combinan con MSmerge_contents y MSmerge_tombstone para determinar qué cambios se deben enviar.

      En el caso de las tablas filtradas, MSmerge_generation_partition_mappings está unido a: MSmerge_current_partition_mappings y MSmerge_contents; y MSmerge_past_partition_mappingsMSmerge_tombstone para determinar qué cambios son pertinentes para la partición que recibe el suscriptor.

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