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, elDBCC 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:- Inicie SQL Server Management Studio y, a continuación, conéctese a la instancia del servidor suscriptor.
- Expanda Bases de datos y, a continuación, expanda la base de datos del suscriptor.
- Expanda Tablasy, 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, 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
- Para obtener más información sobre la detección y finalización de interbloqueos, consulte Detección y finalización de interbloqueos.
- Para obtener más información sobre la
ALTER
instrucción , vea Instrucciones Transact-SQL - Para obtener más información sobre el
DBCC UPDATEUSAGE
comando, vea DBCC UPDATEUSAGE (Transact-SQL)
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de