Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 UPDATEUSAGEcomando .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_ROWSNota:
El
DBCC UPDATEUSAGEcomando 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, elDBCC UPDATEUSAGEcomando no devuelve datos. Si se encuentran y corrigen valores inexactos,DBCC UPDATEUSAGEdevuelve las filas y columnas que se actualizan.Método 2: use la
ALTER INDEXinstrucción .Para resolver este problema, vuelva a generar los índices asociados a la
MSreplication_subscriptionstabla. 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_subscriptionssistema, siga estos pasos:- Inicie SQL Server Management Studio y, a continuación, conéctese a la instancia del servidor de suscriptor.
- Expanda Bases de datos y, a continuación, expanda la base de datos de suscriptor.
- Expanda Tablas y, a continuación, expanda Tablas del sistema.
- Haga clic con el botón derecho en dbo. MSreplication_subscriptions y, a continuación, seleccione Propiedades.
- 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_subscriptionssistema, ejecute la consulta siguiente:SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
Referencias
- Para obtener más información sobre cómo detectar y terminar interbloqueos, consulte Detección y finalización de interbloqueos.
- Para obtener más información sobre la
ALTERinstrucción , vea Instrucciones Transact-SQL. - Para obtener más información sobre el
DBCC UPDATEUSAGEcomando, vea DBCC UPDATEUSAGE (Transact-SQL)