No convergencia cuando SQL Server procesa generaciones secundarias y primarias en lotes de generación independientes

Este artículo le ayuda a resolver el problema de no convergencia que se produce cuando SQL Server procesa generaciones secundarias y primarias en lotes de generación independientes.

Versión del producto original: SQL Server
Número de KB original: 308266

Síntomas

Puede producirse una pérdida de comandos INSERT en tablas secundarias en un suscriptor en las condiciones siguientes:

  • La topología de replicación de mezcla es jerárquica, con un publicador, uno o varios republicadores y uno o más suscriptores.
  • Uno o varios artículos primarios y secundarios existen en una publicación de replicación de mezcla, con un filtro de combinación definido entre ellos.
  • Existe una NOT FOR REPLICATION restricción de clave externa en el republicador y el suscriptor para la relación entre estos dos artículos.
  • Los INSERT en un artículo secundario se producen en una generación independiente de su generación primaria asociada por más que el valor especificado en el parámetro del -DownloadGenerationsPerBatch agente de mezcla. Por lo tanto, el agente de mezcla procesa la generación secundaria en un lote de generaciones independiente de su generación primaria asociada.
  • Hay una interrupción del procesamiento de mezcla entre el publicador y el republicador y entre el procesamiento de los lotes de generación secundario y primario.

Solución alternativa

La arquitectura de replicación de mezcla no proporciona un mecanismo para mantener los cambios primarios y secundarios juntos a través de los límites del lote de generación. Para solucionar este problema, puede hacer lo siguiente:

  • Aumente los -UploadGenerationsPerBatch parámetros y -DownloadGenerationsPerBatch Agente de mezcla a su valor máximo de 2000, lo que elimina prácticamente la posibilidad de procesar la generación de un artículo secundario en un lote independiente de la generación del artículo primario.

-O-

  • Quite la NOT FOR REPLICATION propiedad en las restricciones de clave externa en el republicador. En este caso, el Agente de mezcla no puede insertar filas en el artículo secundario porque no hay filas de artículo primario asociadas. Tenga en cuenta, sin embargo, que podría haber una degradación del rendimiento asociada a este cambio. Si el Agente de mezcla no puede insertar estas filas secundarias, se deben reintentar esos cambios. El proceso de reintento de Agente de mezcla es mucho menos eficaz que su modo normal de procesamiento por lotes.

Más información

Esta es una secuencia más detallada de eventos en los que puede producirse este problema. Los valores predeterminados de los -UploadGenerationsPerBatch parámetros y -DownloadGenerationsPerBatch Agente de mezcla (que tienen un gran peso en este problema) son 100. En el ejemplo siguiente, suponga que los -UploadGenerationsPerBatch parámetros y -DownloadGenerationsPerBatch no se han modificado.

  • Los INSERT se producen en el publicador de nivel superior en un artículo secundario y primario. Un artículo secundario es cualquier artículo de una publicación que tenga una restricción de clave externa a otra tabla, a la que se hace referencia como artículo primario. Estos dos artículos están relacionados con un filtro de combinación de replicación de mezcla y las restricciones de clave externa del lado servidor reales en el republicador y el suscriptor se marcan con la propiedad NOT FOR REPLICATION. Puede ejecutar el procedimiento almacenado sp_help en las tablas para determinar si las restricciones no son para la replicación, si no está seguro.
  • Los INSERT de la tabla secundaria se producen (por ejemplo) en la generación 110. Los INSERT de la tabla primaria se producen (por ejemplo) en la generación 250. La separación entre estas generaciones es mayor que el -DownloadGenerationsPerBatch parámetro .
  • El publicador Agente de mezcla procesa el lote de generaciones que contienen las generaciones de 101 a 200. Después de procesar correctamente este lote y de descargar los cambios asociados en esas generaciones al republicador, se interrumpe el Agente de mezcla del publicador. La interrupción se produce antes de que el Agente de mezcla pueda procesar las generaciones de 201 a 300 (que contienen los cambios del artículo primario). La interrupción puede deberse a la pérdida de conectividad de red, un tiempo de espera de consulta, etc. El Agente de mezcla puede confirmar las filas de artículo secundario sin las filas primarias porque la restricción de clave externa del lado servidor está marcada como NOT FOR REPLICATION, por lo que "suspende" la comprobación de la restricción.
  • Antes de que el Agente de mezcla publisher-republisher empiece a procesarse de nuevo, el Agente de mezcla de republisher-subscriber comienza una sesión de combinación. Comienza el proceso de descarga de los cambios del republicador.
  • Cuando el suscriptor de republicador Agente de mezcla procesa la generación 110 (el artículo secundario INSERTs), evalúa el filtro de combinación presente entre el artículo secundario y el artículo primario. Dado que los cambios del artículo primario aún no han llegado al republicador, el Agente de mezcla determina que estos INSERT secundarios no "califican" el filtro de combinación. El Agente de mezcla descarga la fila MSmerge_genhistory que representa la generación 110, pero ninguno de los cambios de esa generación. Esta Agente de mezcla completa su sesión correctamente.
  • Una ejecución posterior del Agente de mezcla entre el publicador y el republicador procesa correctamente el lote de generaciones que contienen los INSERT del artículo primario (generaciones de 201 a 300) y confirma esos cambios en el republicador.
  • Por último, una sesión de Agente de mezcla posterior entre el publicador y el suscriptor considera la generación 250 y descarga los INSERT del artículo primario en el suscriptor. Sin embargo, dado que el suscriptor también conoce la generación 110 (la generación del artículo secundario), el Agente de mezcla no vuelve a evaluar la partición del artículo secundario.

Esto da como resultado que las filas correctas del artículo primario estén presentes en el suscriptor con orphaned filas secundarias en el republicador.