Código de error: 22903, texto: “Ya hay otra conexión ejecutando ‘sp_replcmds’ para la captura de datos modificados en la base de datos actual.”

Recientemente me enfrenté a un escenario muy interesante en el que para una base de datos se habilitaban tanto la captura de datos modificados como la replicación transaccional. Según la documentación de MS, ambas funciones pueden funcionar juntas, pero debemos tener algunas cosas en cuenta al implementar ambas funciones juntas en una base de datos.

En cuanto a mi caso, aunque el trabajo de captura de datos modificados se estaba ejecutando correctamente, el trabajo del agente lector de registros de replicación transaccional se estaba reintentando con los siguientes mensajes de error.

2021-08-20 10:17:57.073 Status: 0, code: 20011, text: ‘The process could not execute ‘sp_repldone/sp_replcounters’ on ‘ServerName’.’. 2021-08-20 10:17:57.073 The process could not execute ‘sp_repldone/sp_replcounters’ on ‘ServerName’. 2021-08-20 10:17:57.073 Status: 0, code: 22903, text: ‘Another connection is already running ‘sp_replcmds’ for Change Data Capture in the current database.’. 2021-08-20 10:17:57.073 Status: 0, code: 22017, text: ‘The process could not set the last distributed transaction.’. 2021-08-20 10:17:57.073 Status: 0, code: 22037, text: ‘The process could not execute ‘sp_repldone/sp_replcounters’ on ‘ServerName’.’.

Según la documentación de MS, ”  Cuando ambas funciones están habilitadas en la misma base de datos, el agente de lectura de registros llama a  sp_replcmds . Este agente llena tanto las tablas de cambios como las tablas de la base de datos de distribución ”. En otras palabras, el trabajo del agente lector de registros es responsable tanto de la replicación transaccional como de la captura de datos modificados y no se requiere un trabajo de captura CDC independiente.

La solución fue eliminar el trabajo “cdc.DatabaseName_capture” y permitir que el agente lector de registros complete las tablas CDC.

Aquí vale la pena mencionar un punto: en este caso, el agente de lectura de registros se estaba ejecutando en el servidor del distribuidor remoto y no en el distribuidor local, lo que permitió que se crearan tanto el trabajo de captura de CDC como el trabajo del agente de lectura de registros; de lo contrario, el servidor SQL no permite que se creen ambos trabajos. en el mismo servidor; de lo contrario, SQL no permite que se creen tanto el trabajo del agente lector de registros como el trabajo de captura CDC en el mismo servidor para la misma base de datos.

Escribirá otro artículo para explicar el escenario anterior.

¡¡Espero que esta información le ayude!!

¡¡Feliz aprendizaje!!