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

Considere el caso siguiente:

  • La replicación transaccional se configura en SQL Server.
  • La topología de replicación transaccional consta de varios publicadores.
  • Los publicadores replican los datos en la misma base de datos de suscriptor.
  • Los agentes de distribución se ejecutan continuamente o se ejecutan según una programación frecuente. 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 pueden seleccionarse como víctimas 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) quedó en interbloqueo en %.*ls recursos con otro proceso y fue elegida como sujeto 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 isull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = and publication = @P4 @P5 and subscription_type = 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) y publisher_db = y publication = @P4 @P5 y subscription_type = 0 y (substring(transaction_timestamp, 16, 1) = 0 o datalength(transaction_timestamp) 16) <

Causa

Este problema se produce si la estimación de recuento de filas de 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 Secuencias de suscripción, la estimación de recuento de filas es igual al número de suscripciones multiplicadas por el número de flujos configurados 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 rowcount incorrecto. Para ello, ejecute el siguiente comando:

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

    Nota:

    El DBCC UPDATEUSAGE comando determina los valores correctos para las filas, las páginas usadas, las páginas reservadas, las páginas hoja y los 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, vuelva a generar 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 mencionado en la sección Síntomas , la estimación de recuento de filas de la MSreplication_subscriptions tabla del sistema puede ser tan alta como 4.294.967.296. Para comprobar el valor de rowcount, use uno de los métodos siguientes.

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

    Para usar SQL Server Management Studio para comprobar el valor rowcount 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 de suscriptor.
    2. Expanda Bases de datos y, a continuación, expanda la base de datos de suscriptor.
    3. Expanda Tablas y, 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 compruebe el valor de rowcount en el campo Recuento de filas.
  • Método 2: usar una instrucción de consulta.

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

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

Referencias