Partager via


Limitations, problèmes et erreurs connus avec cdc

S’applique à :SQL ServerAzure SQL Managed Instance

Cet article explique les limitations connues, les problèmes et les erreurs liés à la capture de données modifiées (CDC) pour SQL Server et Azure SQL Managed Instance.

Pour la base de données Azure SQL, consultez Problèmes connus avec CDC dans la base de données Azure SQL.

Modification des métadonnées

Pour que la capture des changements de données (CDC) fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que les CDC schema, les tables des changements, les procédures stockées système CDC, les autorisations cdc user par défaut (sys.database_principals) ou renommer le cdc user.

Tous les objets dans sys.objects dont is_ms_shipped la propriété est définie sur 1 ne doivent pas être modifiés.

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'

Différences de classement

Il est important de noter que, dans certains cas, les classements peuvent ne pas être les mêmes dans la base de données et dans les colonnes d’une table configurée pour la capture des changements de données. CDC utilise un stockage temporaire pour remplir les tables secondaires. Si une table a des colonnes char ou varchar avec des classements différents de ceux de la base de données, et si ces colonnes stockent des caractères non-ASCII (par exemple des caractères DBCS codés sur deux octets), la capture des changements de données peut ne pas être en mesure de maintenir la cohérence entre les données modifiées et les données des tables de base. Cela est dû au fait que les variables de stockage temporaire ne peuvent pas être associées à des classements.

Envisagez plutôt l’une des approches suivantes pour vérifier que les données modifiées sont cohérentes avec celles des tables de base :

  • Utilisez le type de données nchar ou nvarchar pour les colonnes contenant des données non ASCII.

  • Vous pouvez également utiliser le même classement pour les colonnes et pour la base de données.

Par exemple, si vous avez une base de données qui utilise le classement SQL_Latin1_General_CP1_CI_AS, considérez la table suivante :

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

La capture des changements de données peut échouer à capturer les données binaires de la colonne C2, car son classement est différent (Chinese_PRC_CI_AI). Utilisez nvarchar pour éviter ce problème :

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
     )

Récupération de base de données accélérée (ADR) et capture de données modifiées (CDC)

L’activation de la capture de données modifiées (CDC) et de la récupération de base de données accélérée (ADR) pour la même base de données n’est pas prise en charge dans SQL Server 2019 (15.x). L’activation de CDC et d’ADR est prise en charge dans les versions ultérieures de SQL Server, à compter de SQL Server 2022 (16.x) Mise à jour cumulative 18.

Lorsque vous activez la CDC, la fonctionnalité de troncation de journal agressive d’ADR est désactivée. En effet, l’analyse CDC accède au journal des transactions de base de données. Les transactions actives conservent la troncation du journal des transactions jusqu’à ce que la transaction soit commitée et que la capture des changements de données la rattrape, ou que la transaction soit abandonnée. Si vous activez cdc sur une base de données où ADR est activé, vous pouvez observer une utilisation plus élevée du journal des transactions. Assurez-vous qu'un espace suffisant de journal des transactions est disponible pour les besoins de toutes vos charges de travail.

Si vous activez CDC, nous vous recommandons d’utiliser l’option d’index reprenable. L’index reprenable ne nécessite pas de garder ouverte une transaction de longue durée pour créer ou reconstruire un index, ce qui permet de tronquer le journal pendant cette opération et de mieux gérer l’espace du journal. Pour plus d’informations, consultez Recommandations pour les opérations d’index en ligne – Considérations sur les index reprenables.

Les instructions DDL en ligne ne sont pas prises en charge.

Les instructions DDL en ligne ALTER TABLE ne sont pas prises en charge lorsque la capture de données modifiées est activée sur une base de données.

L'activation de la CDC échoue si le schéma ou l'utilisateur nommé cdc existe déjà.

Lorsque vous activez la CDC sur une base de données, un nouveau schéma et un nouvel utilisateur nommé cdc sont créés. Par conséquent, la création manuelle d’un schéma personnalisé ou d’un utilisateur nommé cdc n’est pas recommandée, car elle est réservée à l’utilisation du système.

Si vous avez défini manuellement un schéma personnalisé ou un utilisateur nommé cdc dans votre base de données qui n’est pas lié à CDC, la procédure stockée système sys.sp_cdc_enable_db échoue à activer CDC sur la base de données, avec le message d’erreur suivant.

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.

Pour résoudre ce problème :

  • Supprimez manuellement le schéma cdc vide et l’utilisateur cdc. Ensuite, la CDC peut être activée avec succès dans la base de données.

La CDC échoue après ALTER COLUMN

Lorsque le type de données d’une colonne sur une table activée CDC est remplacé par une conversion non prise en charge et qu’une ligne existante est mise à jour vers une valeur déportée, l’analyse CDC peut entraîner des erreurs après la mise à jour.

Voici des exemples de modifications de type de données ALTER COLUMN qui ne sont pas prises en charge lorsque la capture des changements de données (CDC) est activée sur une table :

  • texte vers nvarchar
  • image en varbinary
  • nvarchar vers DATE ou INT
  • bigint en int

La modification du type de données d’une colonne peut entraîner les erreurs suivantes :

La modification de la taille des colonnes d’une table activée pour CDC à l’aide d’instructions DDL peut entraîner des problèmes avec le processus de capture CDC suivant, provoquant l’erreur 2628 ou l’erreur 8115 . Rappelez-vous que les données des tables de modification de la CDC sont conservées en fonction des paramètres configurés par l'utilisateur. Par conséquent, avant d’apporter des modifications à la taille des colonnes, vous devez évaluer si la modification est compatible avec les données existantes dans les tables de modification de CDC.

Si le sys.dm_cdc_errors indique que les analyses échouent en raison des erreurs 2628 ou 8115 pour les tables de modification, vous devez d’abord consommer les données de modification des tables affectées. Après cela, vous devez désactiver puis réactiver CDC sur la table pour résoudre efficacement le problème.

L’activation de CDC échoue quand il existe des déclencheurs « CREATE OBJECT »

Lorsque vous activez la CDC, une cdc user est créée pour gérer le processus de création de la CDC. Le cdc user exécute un certain nombre de procédures stockées pour activer la CDC, et certaines de ces procédures stockées créent des objets qui déclenchent des déclencheurs CREATE OBJECT existants. Étant donné que cdc user n’a pas l’autorisation d’écrire dans la base de données master, ces procédures stockées CDC échouent avec l’erreur 22830.

Désactivez les déclencheurs CREATE OBJECT avant d’activer la CDC sur une base de données. Réactivez ces déclencheurs après la configuration de la CDC.

Importer une base de données à l'aide des opérations d'importation/exportation et d'extraction/publication au niveau des données

Pour les bases de données SQL compatibles avec la CDC, lorsque vous utilisez SqlPackage, SSDT ou d'autres outils SQL pour importer/exporter ou extraire/publier, le schéma et l'utilisateur cdc sont exclus de la nouvelle base de données. Les autres objets CDC non inclus dans les opérations Importer/Exporter et Extraire/Déployer comprennent les tables marquées comme is_ms_shipped=1 dans sys.objects.

Même si la CDC n'est pas activée et que vous avez défini un schéma personnalisé ou un utilisateur nommé cdc dans votre base de données, celui-ci sera également exclu des opérations Importer/Exporter et Extraire/Déployer pour importer/mettre en place une nouvelle base de données.

Basculement de partition avec des variables

L’utilisation de variables avec basculement de partitions sur des bases de données ou des tables avec capture des changements de données (CDC) n’est pas prise en charge pour l’instruction ALTER TABLE ... SWITCH TO ... PARTITION .... Pour en savoir plus, consultez Limitations du basculement de partition.

Résolution des erreurs

Cette section décrit les étapes à suivre pour résoudre les erreurs associées à la CDC sur SQL Server et Azure SQL Managed Instance. Les erreurs liées à la CDC peuvent entraver le bon fonctionnement du processus de saisie et entraîner l’expansion du journal des transactions de la base de données.

Pour examiner ces erreurs, vous pouvez interroger la vue de gestion dynamique sys.dm_cdc_errors. Si la vue de gestion dynamique sys.dm_cdc_errors renvoie des erreurs, se reporter à la section suivante pour comprendre les étapes d’atténuation.

Remarque

Pour plus d’informations sur un code d’erreur particulier, consultez les Événements et erreurs du moteur de base de données.

Voici les différentes catégories de résolution des problèmes incluses dans cette section :

Catégorie Descriptif
Métadonnées modifiées Inclut des informations sur la façon d’atténuer les problèmes liés à la CDC quand la table suivie a été modifiée ou supprimée.
Gestion de l’espace de la base de données Inclut des informations sur la façon d’atténuer les problèmes lorsque l’espace de la base de données a été épuisé.
Limitation de la CDC Inclut des informations sur la façon d’atténuer les problèmes causés par les limitations de la CDC.

Métadonnées modifiées

Erreur 200/208 : nom d’objet non valide

  • Cause : l’erreur peut se produire lorsque les métadonnées de la CDC ont été supprimées. Pour que la capture des changements de données (CDC) fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que les CDC schema, les tables des changements, les procédures stockées système CDC, les autorisations cdc user par défaut (sys.database_principals) ou renommer le cdc user.

  • Recommandation : Pour résoudre ce problème, vous devez désactiver et réactiver la CDC de votre base de données. Quand une base de données est activée pour la capture des données modifiées, le schéma CDC, l’utilisateur CDC, les tables de métadonnées et d’autres objets système sont créés pour la base de données.

Remarque

Les objets trouvés dans l’affichage catalogue système sys.objects avec is_ms_shipped=1 et schema_name='cdc' ne doivent pas être modifiés ni supprimés.

Erreur 1202 : le principal de base de données n’existe pas ou l’utilisateur n’est pas membre

  • Cause : L’erreur peut se produire quand cdc user a été supprimé. Pour que la CDC fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que CDC schema, les tables modifiées, les procédures stockées système CDC, les autorisations cdc user par défaut (sys.database_principals) ou renommer le cdc user.

  • Recommandation : vérifiez que l’utilisateur cdc existe dans votre base de données et dispose également du rôle db_owner attribué. Pour créer l’utilisateur cdc, consultez l’exemple Créer un utilisateur cdc et lui attribuer un rôle.

Erreur 15517 : impossible d’exécuter en tant que principal de base de données, car le principal n’existe pas

  • Cause : ce type de principal ne peut pas être impersonné ou vous n’avez pas l’autorisation. L’erreur peut se produire lorsque les métadonnées CDC ont été supprimées ou qu’elles ne font plus partie du rôle db_owner. Pour que la capture des changements de données (CDC) fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que les CDC schema, les tables des changements, les procédures stockées système CDC, les autorisations cdc user par défaut (sys.database_principals) ou renommer le cdc user.

  • Recommandation : vérifiez que l’utilisateur cdc existe dans votre base de données et dispose également du rôle db_owner attribué. Pour créer l’utilisateur cdc, consultez l’exemple Créer un utilisateur cdc et lui attribuer un rôle.

Erreur 18807 : impossible de trouver un ID d’objet pour la table système de réplication

  • Cause : cette erreur se produit lorsque SQL Server ne peut pas trouver ou accéder à la table système de réplication « %s ». Cela peut être dû au fait que la table est manquante ou inaccessible. Pour que la capture des changements de données (CDC) fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que les CDC schema, les tables des changements, les procédures stockées système CDC, les autorisations cdc user par défaut (sys.database_principals) ou renommer le cdc user.

  • Recommandation : vérifiez que la table système existe et qu'elle est accessible en l’interrogeant directement. Interrogez le catalogue système sys.objects , définissez la clause de prédicat avec is_ms_shipped=1 et schema_name='cdc' pour répertorier tous les objets liés à cdc. Si la requête ne retourne aucun objet, vous devez désactiver puis réactiver la CDC pour votre base de données. L’activation de la capture de données modifiées pour une base de données crée le schéma cdc, l'utilisateur cdc, les tables de métadonnées et d’autres objets système pour la base de données.

Erreur 21050 : seuls les membres du rôle serveur fixe sysadmin ou db_owner peuvent effectuer cette opération

  • Cause : Le a été supprimé du rôle de base de données cdc user ou du rôle serveur db_owner.

  • Recommandation : vérifiez que le rôle cdc user est attribué au db_owner. Pour créer l’utilisateur cdc, consultez l’exemple Créer un utilisateur cdc et lui attribuer un rôle.

Erreur 22830 : Impossible de mettre à jour les métadonnées qui indiquent que la base de données <database name> est activée pour la capture de données modifiées. L’échec s’est produit lors de l’exécution de la commande <CDC stored procedure name>.

  • Cause : cette erreur se produit lorsqu’un déclencheur « CREATE OBJECT » existe dans la base de données ou sur le serveur. Lorsque vous activez la CDC, une cdc user est créée pour gérer le processus de création de la CDC. Le cdc user exécute un certain nombre de procédures stockées pour activer la CDC, et certaines de ces procédures stockées créent des objets qui déclenchent des déclencheurs CREATE OBJECT existants. Étant donné que cdc user n’a pas l’autorisation d’écrire dans la base de données master, ces procédures stockées CDC échouent avec l’erreur 22830.

  • Recommandation : avant d’activer la capture des changements de données (CDC) sur une base de données, désactivez les déclencheurs CREATE OBJECT. Réactivez ces déclencheurs après la configuration de la CDC.

Gestion de l’espace de la base de données

Erreur 1105 : impossible d’allouer de l’espace pour l’objet dans la base de données, car le groupe de fichiers est plein

  • Cause : cette erreur se produit lorsque le groupe de fichiers principal d’une base de données manque d’espace et que SQL Server ne parvient pas à allouer plus d’espace pour un objet (par exemple, une table ou un index) dans ce groupe de fichiers.

  • Recommandation : pour résoudre ce problème, supprimez toutes les données inutiles de votre base de données afin de libérer de l’espace. Identifiez les tables, index ou autres objets inutilisés dans le groupe de fichiers qui peuvent être supprimés en toute sécurité. Surveiller de près l’utilisation de l’espace, pour plus d’informations, consultez Gérer l’espace des fichiers pour les bases de données dans Azure SQL Database

    Si la suppression des données/objets inutiles n'est pas envisageable, pensez à allouer plus d'espace au journal des transactions de votre base de données. Pour plus d'informations sur la gestion du journal des transactions, consultez le Guide d'architecture et de gestion du journal des transactions de SQL Server.

Limitation de la CDC

Erreur 241 - Échec de la conversion lors de la conversion de la date et/ou de l’heure à partir de la chaîne de caractères

  • Cause : cette erreur se produit lorsque ALTER COLUMN est effectué sur un type de données DATE et que la table a le CDC activé. Par exemple, si une table a une colonne nvarchar et que vous modifiez le type de données en DATE (ALTER TABLE table_name ALTER COLUMN [column_name] DATE NULL), vous pouvez voir cette erreur dans la table sys.dm_cdc_errors en raison d’une conversion de données non prise en charge dans la table de modifications, même si la commande ALTER sur la table source réussit.

  • Recommandation : pour résoudre ce problème, désactivez et réactivez CDC pour votre table après avoir modifié la colonne. Vous pouvez également désactiver CDC avant de modifier la colonne, puis réactiver CDC après la modification ALTER COLUMN.

Erreur 245 - Échec de la conversion lors de la conversion de la valeur de la chaîne en int

  • Cause : cette erreur se produit lorsque la commande ALTER COLUMN est émise pour modifier le type de données d'une colonne lorsque la table a CDC activé. Par exemple, si une table a une colonne nvarchar et que vous modifiez le type de données en INT (ALTER TABLE table_name ALTER COLUMN [column_name] INT NULL), vous pouvez voir cette erreur dans la table sys.dm_cdc_errors en raison d’une conversion de données non prise en charge dans la table de modifications, même si la commande ALTER sur la table source réussit.

  • Recommandation : pour résoudre ce problème, désactivez et réactivez CDC pour votre table après avoir modifié la colonne. Vous pouvez également désactiver CDC avant de modifier la colonne, puis réactiver CDC après la modification ALTER COLUMN.

Erreur 913 : la tâche de capture CDC échoue lors du traitement des modifications pour une table avec le type de données système CLR

  • Cause : cette erreur se produit lors de l'activation de CDC sur une table avec le type de données CLR du système, en apportant des modifications DML et ensuite des modifications DDL sur la même table, pendant que la tâche de capture de CDC traite les modifications liées à d'autres tables.

  • Recommandation : les étapes recommandées sont de mettre DML au repos, d’exécuter une tâche de capture pour traiter les modifications, d’exécuter DDL pour la table, d’exécuter une tâche de capture pour traiter les modifications DDL, puis de réactiver le traitement DML. Pour plus d’informations, consultez Échec du travail de capture CDC lors du traitement des changements pour une table avec le type de données CLR système (géométrie, géographie ou hierarchyid).

Erreur 2628 : les données binary ou String seront tronquées dans la table

  • Cause : la modification de la taille des colonnes d’une table avec CDC à l’aide d’instructions DDL peut entraîner des problèmes avec le processus de capture CDC suivant. La vue de gestion dynamique (DMV) de « sys.dm_cdc_errors » est utile pour vérifier toute CDC pour tout problème signalé, comme les erreurs numéro 2628 et 8115.

  • Recommandation : avant d’apporter des modifications à la taille des colonnes, vous devez évaluer si la modification est compatible avec les données existantes dans les tables de modification de CDC. Pour résoudre ce problème, vous devez désactiver et réactiver la CDC pour votre base de données. Pour plus d’informations sur l’activation de la CDC pour une base de données ou une table, consultez Activer la CDC pour une base de données et Activer la CDC pour une table.

Erreur 8115 - Erreur de dépassement arithmétique lors de la conversion du type de données de bigint en int

  • Cause : cette erreur se produit lorsqu'un DDL ALTER COLUMN est exécuté sur une table compatible CDC, ce qui entraîne une diminution de la précision de la colonne (par exemple, en modifiant le type de données de la colonne de bigint à int). La colonne de précision réduite ne peut pas contenir les valeurs présentes dans la table de modifications.

  • Recommandation : pour résoudre ce problème, désactivez et réactivez CDC pour votre table après avoir modifié la colonne. Vous pouvez également désactiver CDC avant de modifier la colonne, puis réactiver CDC après la modification ALTER COLUMN.

Créer un utilisateur et attribuer un rôle

Si cdc user a été supprimé, vous pouvez ajouter à nouveau manuellement l’utilisateur.

Utilisez le script T-SQL suivant pour créer un utilisateur (cdc) et attribuer le rôle approprié pour le même (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';

Vérifier et ajouter des appartenance à un rôle

Pour vérifier si l’utilisateur cdc appartient au rôle sysadmin ou db_owner, exécutez la requête T-SQL suivante :

EXECUTE AS USER = 'cdc';

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

Si l’utilisateur cdc n’appartient pas à un rôle, exécutez la requête T-SQL suivante pour ajouter un rôle db_owner à l’utilisateur cdc.

EXEC sp_addrolemember 'db_owner' , 'cdc';