Compartir a través de


Limitaciones, problemas y errores conocidos con CDC

Se aplica a:SQL ServerAzure SQL Managed Instance

En este artículo se explican las limitaciones, los problemas y los errores conocidos con la captura de datos modificados (CDC) para SQL Server y Azure SQL Managed Instance.

Para Azure SQL Database, consulta Problemas conocidos con CDC en Azure SQL Database.

Modificar los metadatos

Para que CDC funcione correctamente, no debe modificar manualmente ningún metadato CDC como CDC schema, cambiar tablas, procedimientos almacenados del sistema CDC, permisos predeterminados cdc user (sys.database_principals) o cambiar el nombre de cdc user.

Los objetos de sys.objects con la propiedad is_ms_shipped establecida en 1 no deben modificarse.

SELECT    name AS object_name   
        ,SCHEMA_NAME(schema_id) AS schema_name  
        ,type_desc  
        ,is_ms_shipped  
FROM sys.objects 
WHERE is_ms_shipped= 1 AND SCHEMA_NAME(schema_id) = 'cdc'

Diferencias de intercalación

Es importante ser consciente de un caso en el que se tienen distintas intercalaciones entre la base de datos y las columnas de una tabla configurada para la captura de datos modificados. CDC usa el almacenamiento provisional para rellenar las tablas auxiliares. Si una tabla tiene columnas char o varchar con intercalaciones diferentes de la intercalación de base de datos y si esas columnas almacenan caracteres no ASCII (como caracteres DBCS de doble byte), es posible que CDC no pueda conservar los datos modificados coherentes con los datos de las tablas base. Esto se debe a que las variables del almacenamiento provisional no pueden tener intercalaciones asociadas a estas.

Plantéate la posibilidad de aplicar uno de los siguientes métodos para asegurarte de que la captura de datos modificados sea coherente con las tablas base:

  • Use el tipo de datos nchar o nvarchar para las columnas que contienen datos no ASCII.

  • También puede usar la misma intercalación para las columnas y para la base de datos.

Por ejemplo, si tiene una base de datos que usa una intercalación de SQL_Latin1_General_CP1_CI_AS, observe la siguiente tabla:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 VARCHAR(10) collate Chinese_PRC_CI_AI)

La captura de datos modificados (CDC) podría no capturar los datos binarios de la columna C2, dado que su intercalación es diferente (Chinese_PRC_CI_AI). Use nvarchar para evitar este problema:

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 NVARCHAR(10) collate Chinese_PRC_CI_AI --Unicode data type, CDC works well with this data type
     )

Recuperación acelerada de bases de datos (ADR) y captura de datos modificados (CDC)

No se admite la habilitación de la captura de datos modificados (CDC) y la recuperación acelerada de bases de datos (ADR) para la misma base de datos en SQL Server 2019 (15.x). La habilitación de CDC y ADR se admite en versiones posteriores de SQL Server a partir de la actualización acumulativa 18 de SQL Server 2022 (16.x).

Al habilitar CDC, la función de truncamiento agresivo del registro de ADR queda deshabilitada. Esto se debe a que el análisis CDC accede al registro de transacciones de la base de datos. Las transacciones activas siguen manteniendo el truncamiento del registro de transacciones hasta que la transacción se confirme y CDC se ponga al día o se anulen las transacciones. Si habilita CDC en una base de datos donde ADR está habilitado, es posible que observe un mayor uso del registro de transacciones. Asegúrese de que haya suficiente espacio de registro de transacciones disponible para las necesidades de todas las cargas de trabajo.

Al habilitar CDC, se recomienda usar la opción de índice reanudable. El índice reanudable no requiere mantener abierta una transacción de larga duración para crear o reconstruir un índice, lo que permite el truncamiento del registro de transacciones durante esta operación y una mejor administración del espacio del registro. Para obtener más información, consulte Directrices para las operaciones de índice en línea: consideraciones sobre índices reanudables.

Las instrucciones DDL en línea no son compatibles

Las instrucciones DDL en línea no se admiten cuando la captura de datos modificados está habilitada en una base de datos.

Se produce un error en la habilitación de CDC si el esquema o el usuario denominado cdc ya existe

Al habilitar CDC en una base de datos, crea un nuevo esquema y un usuario denominado cdc. Por lo tanto, no se recomienda crear manualmente un esquema personalizado o un usuario denominado cdc , ya que está reservado para el uso del sistema.

Si ha definido manualmente un esquema personalizado o un usuario denominado cdc en la base de datos que no está relacionado con CDC, el procedimiento sys.sp_cdc_enable_db almacenado del sistema no puede habilitar CDC en la base de datos con el siguiente mensaje de error.

The database <database_name> cannot be enabled for change data capture because a database user named 'cdc' or a schema named 'cdc' already exists in the current database. These objects are required exclusively by CDC. Drop or rename the user or schema and retry the operation.

Para solucionar este problema:

  • Elimine manualmente el esquema cdc vacío y el usuario cdc. A continuación, CDC puede habilitarse correctamente en la base de datos.

CDC produce un error después de ALTER COLUMN en varchar y varbinary

Cuando el tipo de datos de una columna de una tabla habilitada para CDC cambia de texto a nvarchar, o imagen a varbinary, y se actualiza una fila existente a un valor fuera de fila. Después de la actualización, el examen CDC producirá errores.

Cambios de DDL en tablas de origen

Cambiar el tamaño de las columnas de una tabla habilitada para CDC mediante instrucciones DDL puede provocar problemas con el proceso de captura CDC posterior, lo que da como resultado el error 2628 o el error 8115. Recuerde que los datos de las tablas de cambios CDC se conservan en función de las opciones configuradas por el usuario. Por lo tanto, antes de realizar cambios en el tamaño de columna, debe evaluar si la alteración es compatible con los datos existentes en las tablas de cambios CDC.

Si sys.dm_cdc_errors indica que se producen errores en los exámenes debido al error 2628 o error 8115 para las tablas de cambios, primero debe consumir los datos modificados en las tablas de cambios afectadas. Después, debe deshabilitar y volver a habilitar la CDC en la tabla para resolver el problema de forma eficaz.

Se produce un error al habilitar CDC cuando existen desencadenadores "CREATE OBJECT"

Al habilitar CDC, se crea un cdc user para administrar el proceso de creación de CDC. cdc user ejecuta una serie de procedimientos almacenados para habilitar CDC y algunos de estos procedimientos almacenados crean objetos que activan desencadenadores existentesCREATE OBJECT. Dado que cdc user no tiene permiso para escribir en la base de datos master, estos procedimientos almacenados de CDC fallan con el error 22830.

Desactive cualquier desencadenador CREATE OBJECT antes de habilitar CDC en una base de datos. Vuelva a habilitar estos desencadenadores después de configurar CDC.

Importación de base de datos mediante operaciones de Import/Export y Extract/Publish de capa de datos

En el caso de las bases de datos SQL habilitadas para CDC, cuando se usa SqlPackage, SSDT u otras herramientas de SQL para realizar las operaciones de Import/Export o Extract/Publish, el esquema cdc y el usuario se excluyen en la nueva base de datos. Otros objetos CDC no incluidos en las operaciones Import/Export y Extract/Deploy incluyen las tablas marcadas como is_ms_shipped=1 en sys.objects.

Incluso si CDC no está habilitado y ha definido un esquema personalizado o un usuario denominado cdc en su base de datos, este también se excluirá en las operaciones de importación/exportación y extracción/despliegue para importar o configurar una nueva base de datos.

Conmutación de particiones con variables

El uso de variables con conmutación de particiones en bases de datos o tablas con captura de datos modificados (CDC) no se admite para la instrucción ALTER TABLE ... SWITCH TO ... PARTITION .... Consulte las limitaciones de la conmutación de particiones para más información.

Errores de solución de problemas

En esta sección se describen los pasos para solucionar problemas asociados a la CDC en SQL Server y Azure SQL Managed Instance. Los errores relacionados con CDC pueden obstruir el funcionamiento adecuado del proceso de captura y provocar la expansión del registro de transacciones de la base de datos.

Para examinar estos errores, puede consultar la vista de administración dinámica sys.dm_cdc_errors. Si la vista de administración dinámica sys.dm_cdc_errors devuelve errores, consulta la sección siguiente para comprender los pasos de mitigación.

Nota:

Para obtener más información sobre un código de error determinado, consulte Eventos y errores del motor de base de datos.

Estas son las distintas categorías de solución de problemas incluidas en esta sección:

Categoría Descripción
Metadatos modificados Incluye información sobre cómo mitigar los problemas relacionados con la CDC cuando se ha modificado o quitado la tabla de seguimiento.
Administración del espacio de base de datos Incluye información sobre cómo mitigar los problemas cuando se ha agotado el espacio de base de datos.
Limitación de la CDC Incluye información sobre cómo mitigar los problemas causados por las limitaciones de la CDC.

Metadatos modificados

Error 200/208: nombre de objeto no válido

  • Causa: el error puede producirse cuando se han quitado los metadatos CDC. Para que CDC funcione correctamente, no debe modificar manualmente ningún metadato CDC como CDC schema, cambiar tablas, procedimientos almacenados del sistema CDC, permisos predeterminados cdc user (sys.database_principals) o cambiar el nombre de cdc user.

  • Recomendación: para solucionar este problema, debes deshabilitar y volver a habilitar CDC para la base de datos. Cuando se habilita la captura de datos modificados en una base de datos, se crean el esquema cdc, el usuario cdc, las tablas de metadatos y otros objetos de sistema para la base de datos.

Nota:

Los objetos encontrados en la vista de catálogo del sistema sys.objects con is_ms_shipped=1 y schema_name='cdc' no deben modificarse ni quitarse.

Error 1202: el principal de la base de datos no existe o el usuario no es miembro

  • Causa: el error puede producirse cuando cdc user se ha quitado. Para que la CDC funcione correctamente, no debes modificar manualmente ningún metadato de CDC como CDC schema, tablas de cambios, procedimientos almacenados del sistema CDC, permisos de cdc user predeterminados (sys.database_principals) o cambiar el nombre de cdc user.

  • Recomendación: asegúrate de que el usuario cdc existe en la base de datos y también tiene asignado el rol db_owner. Para crear el usuario cdc, consulte el ejemplo Creación de un usuario CDC y asignación de roles.

Error 15517: no se puede ejecutar como entidad de base de datos porque la entidad no existe

  • Causa: este tipo de entidad de seguridad no se puede suplantar, o bien no tiene usted permiso. El error puede producirse cuando se han eliminado los metadatos CDC o ya no forman parte del rol db_owner. Para que CDC funcione correctamente, no debe modificar manualmente ningún metadato CDC como CDC schema, cambiar tablas, procedimientos almacenados del sistema CDC, permisos predeterminados cdc user (sys.database_principals) o cambiar el nombre de cdc user.

  • Recomendación: asegúrate de que el usuario cdc existe en la base de datos y también tiene asignado el rol db_owner. Para crear el usuario cdc, consulte el ejemplo Creación de un usuario CDC y asignación de roles.

Error 18807: no se puede encontrar un id. de objeto para la tabla del sistema de replicación

  • Causa: este error se produce cuando SQL Server no encuentra la tabla del sistema de replicación "%s" o no tiene acceso a ella. Esto podría deberse a que falta la tabla o no es accesible. Para que CDC funcione correctamente, no debe modificar manualmente ningún metadato CDC como CDC schema, cambiar tablas, procedimientos almacenados del sistema CDC, permisos predeterminados cdc user (sys.database_principals) o cambiar el nombre de cdc user.

  • Recomendación: comprueba que la tabla del sistema existe y que se puede obtener acceso a ella consultándola directamente. Consulte el catálogo del sistema sys.objects , establezca la cláusula predicate con is_ms_shipped=1 y schema_name='cdc' para enumerar todos los objetos relacionados con CDC. Si la consulta no devuelve ningún objeto, debes deshabilitar y volver a habilitar CDC para la base de datos. Al habilitar la captura de datos modificados para una base de datos, se crea el esquema de CDC, el usuario de CDC, las tablas de metadatos y otros objetos del sistema para la base de datos.

Error 21050: solo los miembros del rol fijo de servidor administrador del sistema o propietario de la BD pueden realizar esta operación.

  • Causa: cdc user se ha quitado del rol de base de datos db_owner o del rol de servidor sysadmin.

  • Recomendación: asegúrese de que cdc user tiene asignado el db_owner rol. Para crear el usuario cdc, consulte el ejemplo Creación de un usuario CDC y asignación de roles.

Error 22830: no se pudieron actualizar los metadatos que indican que la base de datos <database name> está habilitada para la captura de datos modificados. Error al ejecutar el comando <CDC stored procedure name>.

  • Causa: este error se produce cuando existe un desencadenador "CREATE OBJECT" en la base de datos o en el servidor. Al habilitar CDC, se crea un cdc user para administrar el proceso de creación de CDC. cdc user ejecuta una serie de procedimientos almacenados para habilitar CDC y algunos de estos procedimientos almacenados crean objetos que activan desencadenadores existentesCREATE OBJECT. Dado que cdc user no tiene permiso para escribir en la base de datos master, estos procedimientos almacenados de CDC producen el error 22830.

  • Recomendación: Antes de habilitar CDC en una base de datos, deshabilite los CREATE OBJECT desencadenadores. Vuelva a habilitar estos desencadenadores una vez configurado CDC.

Administración del espacio de base de datos

Error 1105: no se pudo asignar espacio para el objeto de la base de datos porque el grupo de archivos está lleno

  • Causa: este error se produce cuando el grupo de archivos principal de una base de datos se queda sin espacio y SQL Server no puede asignar más espacio para un objeto (como una tabla o índice) dentro de ese grupo de archivos.

  • Recomendación: para resolver este problema, elimina los datos innecesarios de la base de datos para liberar espacio. Identifica tablas, índices u otros objetos no usados en el grupo de archivos que se pueden quitar de forma segura. Para más información sobre cómo supervisar con detalle el uso del espacio, consulte Administración del espacio de archivos para las bases de datos en Azure SQL Database

    En caso de que quitar datos/objetos innecesarios no sea una opción, considera la posibilidad de asignar más espacio para el registro de transacciones de la base de datos. Para más información sobre el registro de transacciones, consulta la guía de arquitectura y administración de registro de transacciones de SQL Server

Limitación de la CDC

Error 2628: los datos binarios o de tipo cadena se truncarían en una tabla

  • Causa: Cambiar el tamaño de las columnas de una tabla habilitada para CDC mediante instrucciones DDL puede provocar problemas en el proceso de captura de CDC posterior. La Vista de Administración Dinámica (DMV) "sys.dm_cdc_errors" es útil para comprobar cualquier caso de CDC ante problemas reportados, como los números de errores 2628 y 8115.

  • Recomendación: antes de realizar cambios en el tamaño de columna, debes evaluar si la alteración es compatible con los datos existentes en las tablas de cambios CDC. Para solucionar este problema, debes deshabilitar y volver a habilitar CDC para la base de datos. Para obtener más información sobre cómo habilitar CDC para una base de datos o una tabla, vea Habilitar CDC para una base de datos y Habilitar CDC para una tabla.

Error 913: se produce un error en el trabajo de captura de CDC al procesar los cambios de una tabla con el tipo de datos CLR del sistema

  • Causa: este error se produce al habilitar la CDC en una tabla con el tipo de datos CLR del sistema, realizar cambios de DML y, a continuación, realizar cambios de DDL en la misma tabla mientras el trabajo de captura de la CDC procesa los cambios relacionados con otras tablas.

  • Recomendación: Los pasos recomendados son poner DML en modo inactivo en la tabla, ejecutar un trabajo de captura para procesar los cambios, ejecutar DDL para la tabla, ejecutar un trabajo de captura para procesar los cambios de DDL y, a continuación, volver a habilitar el procesamiento de DML. Para obtener más información, consulte El trabajo de captura CDC produce un error al procesar los cambios de una tabla con el tipo de datos CLR del sistema (geometry, geography o hierarchyid).

Creación de usuarios y asignación de roles

Si cdc user se quitó, puedes volver a agregar el usuario manualmente.

Use el siguiente script de T-SQL para crear un usuario (cdc) y asignar el rol adecuado para el mismo (db_owner).

IF NOT EXISTS 
(
    SELECT * 
    FROM sys.database_principals 
    WHERE NAME = 'cdc'
)
BEGIN
    CREATE USER [cdc] 
    WITHOUT LOGIN WITH DEFAULT_SCHEMA = [cdc];
END

EXEC sp_addrolemember 'db_owner', 'cdc';

Comprobación y adición de pertenencia a roles

Para comprobar si el usuario cdc pertenece al rol sysadmin o db_owner, ejecute la siguiente consulta de T-SQL:

EXECUTE AS USER = 'cdc';

SELECT is_srvrolemember('sysadmin'), is_member('db_owner');

Si el usuario cdc no pertenece a ninguno de los roles, ejecute la siguiente consulta de T-SQL para agregar el rol db_owner al usuario cdc.

EXEC sp_addrolemember 'db_owner' , 'cdc';