Compartir vía


Problemas y errores conocidos con CDC

Se aplica a:SQL ServerAzure SQL Managed Instance

Este artículo explica los problemas conocidos y los errores 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 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.

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. La captura de datos modificados usa el almacenamiento provisional para rellenar las tablas laterales. Si una tabla tiene columnas CHAR o VARCHAR con intercalaciones que son diferentes de la intercalación de base de datos y esas columnas almacenan caracteres que no son ASCII (por ejemplo, caracteres DBCS de doble byte), es posible que la captura de datos modificados no pueda conservar los datos modificados de manera coherente 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 que no sean 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 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 la base de datos (ADR) y Captura de datos modificados (CDC)

Actualmente, no se admite la habilitación de la captura de datos modificados (CDC) y la recuperación acelerada de la base de datos (ADR). Al habilitar la captura de datos de modificados (CDC) en SQL Server, la función de truncamiento agresivo de registros de ADR está 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. Esto puede provocar varios problemas, como el registro de transacciones que rellena más de lo habitual o las operaciones de datos registradas en la tabla lateral que son anómalas.

Al habilitar CDC, se recomienda usar la opción Índice reanudable. La recompilación de índice reanudable no le exige que mantenga abierta una transacción de larga ejecución para crear o recompilar un índice, lo que permite el truncamiento del registro durante esta operación y una mejor administración del espacio de registro. Para obtener más información, consulta Directrices para las operaciones de índice en línea: consideraciones sobre el índice reanudable.

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 almacenado del sistema sys.sp_cdc_enable_db no puede habilitar CDC en la base de datos con el siguiente mensaje de error.

La base de datos <database_name> no se puede habilitar para la captura de datos modificados porque ya existe un usuario de base de datos con el nombre «cdc» o un esquema con el nombre «cdc» en la base de datos actual. Estos objetos los requiere exclusivamente la CDC. Quite el usuario o el esquema o cámbielos de nombre e intente de nuevo la operación.

Para solucionar este problema:

  • Quite manualmente el esquema vacío cdc y el usuario cdc. A continuación, CDC se puede habilitar 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 TEXT a VARCHAR o IMAGE 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 DDL en las 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 al error 8115 de las tablas de cambios, primero debe consumir los datos de cambio en las tablas de cambios afectadas. Después, debe deshabilitar y volver a habilitar CDC en la tabla para resolver el problema de forma eficaz.

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 la base de datos que también se excluirá en las operaciones Import/Export y Extract/Deploy 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:

Category 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 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: para solucionar este problema, debes deshabilitar y volver a habilitar CDC para la base de datos. Cuando se habilita la captura de datos modificados habilitada en una base de datos, se crean para la base de datos el esquema cdc, el usuario cdc, las tablas de metadatos y otros objetos de sistema.

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: la entidad de seguridad de base de datos no existe o el usuario no es miembro

  • Causa: el error puede producirse cuando se ha quitado el usuario CDC. 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 seguridad de base de datos porque la entidad de seguridad no existe

  • Causa: este tipo de entidad de seguridad no se puede suplantar o bien no tiene permiso. El error puede producirse cuando se han quitado los metadatos CDC o ya no forma parte del rol db_owner. 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 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 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: comprueba que la tabla del sistema existe y que se puede obtener acceso a ella consultándola directamente. Consulta el catálogo del sistema sys.objects, establece la cláusula predicado 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. Habilitación de la captura de datos modificados habilitada en una base de datos se crea para la base de datos el esquema cdc, el usuario cdc, las tablas de metadatos y otros objetos de sistema.

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

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

  • Recomendación: asegúrate de que el usuario cdc 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.

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 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 con la CDC habilitada mediante instrucciones DDL puede provocar problemas con el proceso de captura de la CDC posterior. La vista de administración dinámica (DMV) de «sys.dm_cdc_errors» es útil para comprobar los problemas notificados de CDC, como los errores número 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, consulta Habilitar CDC para una base de datos y Habilitar CDC para una tabla.

Error 913: se produce un error en el trabajo de captura 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 Se produce un error en el trabajo de captura CDC al procesar los cambios.

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';

Pasos siguientes