Error 1205 al configurar la replicación transaccional

Este artículo le ayuda a resolver un problema que se produce al configurar la replicación transaccional en SQL Server.

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

Síntomas

Imagine la siguiente situación:

  • La replicación transaccional se configura en SQL Server.
  • La topología de replicación transaccional consta de varios publicadores.
  • Los publicadores replican datos en la misma base de datos de suscriptor.
  • Los agentes de distribución se ejecutan continuamente o se ejecutan con frecuencia. Por ejemplo, los agentes de distribución se ejecutan cada minuto.

En este escenario, los agentes de distribución pueden estar implicados en un escenario de interbloqueo y se pueden seleccionar como víctima de interbloqueo. Cuando se produce este problema, puede recibir un mensaje de error similar al siguiente:

Error 1205
La transacción (id. de proceso %d) se interbloqueó en los recursos %.*ls con otro proceso y se ha elegido como la víctima del interbloqueo. Vuelva a ejecutar la transacción.

Si habilita la marca de seguimiento 1222 para redirigir la información de interbloqueo al registro de errores de SQL Server, recibirá un mensaje de error similar a uno de los siguientes:

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp) when 16 then isnull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(substring(transaction_timestamp, 16, 1) como binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0 y (substring(transaction_timestamp, 16, 1) = 0 o datalength(transaction_timestamp) < 16)

Causa

Este problema se produce si la estimación del recuento de filas para la tabla del sistema de números MSreplication_subscriptions es incorrecta. Si la estimación del recuento de filas es incorrecta, el motor de base de datos de SQL Server puede usar un método incorrecto para actualizar la base de datos.

Nota:

Normalmente, la estimación correcta del recuento de filas es igual al número de suscripciones de la base de datos. Si usa la característica Flujos de suscripción, la estimación del recuento de filas es igual al número de suscripciones multiplicado por el número de secuencias configuradas para cada suscripción.

Solución

Para resolver este problema, utilice uno de los métodos siguientes.

  • Método 1: use el DBCC UPDATEUSAGE comando .

    Para resolver este problema, actualice el valor de recuento de filas incorrecto. Para comprobarlo, ejecute el siguiente comando:

    DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
    

    Nota:

    El DBCC UPDATEUSAGE comando determina los valores correctos para filas, páginas usadas, páginas reservadas, páginas hoja y recuentos de páginas de datos para cada partición de una tabla. Si estos valores son correctos, el DBCC UPDATEUSAGE comando no devuelve datos. Si se encuentran y corrigen valores inexactos, DBCC UPDATEUSAGE devuelve las filas y columnas que se actualizan.

  • Método 2: use la ALTER INDEX instrucción .

    Para resolver este problema, recompile los índices asociados a la MSreplication_subscriptions tabla. Para ello, use la siguiente instrucción:

    ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
    

Más información

Cuando se produce el problema que se menciona en la sección Síntomas , la estimación del recuento de filas de la tabla del MSreplication_subscriptions sistema puede ser tan alta como 4.294.967.296. Para comprobar el valor de recuento de filas, use uno de los métodos siguientes.

  • Método 1: Use SQL Server Management Studio.

    Para usar SQL Server Management Studio para comprobar el valor de recuento de filas de la tabla del MSreplication_subscriptions sistema, siga estos pasos:

    1. Inicie SQL Server Management Studio y, a continuación, conéctese a la instancia del servidor suscriptor.
    2. Expanda Bases de datos y, a continuación, expanda la base de datos del suscriptor.
    3. Expanda Tablasy, a continuación, expanda Tablas del sistema.
    4. Haga clic con el botón derecho en dbo. MSreplication_subscriptions y, a continuación, seleccione Propiedades.
    5. Seleccione Almacenamiento y, a continuación, compruebe el valor de recuento de filas en el campo Recuento de filas.
  • Método 2: Use una instrucción de consulta.

    Para comprobar el valor de recuento de filas de la tabla del MSreplication_subscriptions sistema, ejecute la consulta siguiente:

    SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
    

Referencias