Partager via


Limitations connues, problèmes et erreurs avec cdc

S’applique à : SQL Server Azure 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 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.

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. La capture des changements de données utilise le stockage temporaire pour remplir les tables secondaires. Si une table comprend 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 qui contiennent 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, regardez le tableau suivant :

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)

Actuellement, l'activation de la capture des changements de données (CDC) et de la récupération de base de données accélérée (ADR) n'est pas prise en charge. Quand vous activez la capture des changements de données (CDC) sur SQL Server, la fonctionnalité de troncation de journal agressive de ADR est automatiquement 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 validée et la capture de données modifiées la rattrape, ou alors que la transaction soit interrompue. Cette situation peut entraîner divers problèmes, notamment le fait que le journal des transactions se remplit plus que d'habitude ou que les opérations de données enregistrées dans la table secondaires sont anormales.

Lors de l’activation de la capture de données modifiées, nous vous recommandons d’utiliser l’option d’index pouvant être repris. L'index récupérable ne nécessite pas de maintenir 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 d'améliorer la gestion de l'espace du journal. Pour plus d’informations, consultez les Recommandations pour les opérations d’index en ligne - Considérations relatives à l’index de reprise.

Les instructions DDL en ligne ne sont pas prises en charge

Les instructions DDL en ligne 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. La création manuelle d'un schéma personnalisé ou d'un utilisateur nommé cdc n'est donc pas recommandée, car elle est réservée à l'usage 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é à la CDC, la procédure stockée système sys.sp_cdc_enable_db ne parviendra pas à activer le CDC sur la base de données et affichera le message d'erreur suivant.

La base de données <database_name> ne peut pas être activée pour la capture des changements de données, car la base de données actuelle comprend déjà un utilisateur de base de données ou un schéma nommé 'cdc'. Ces objets sont requis en mode exclusif par la CDC. Supprimez ou renommez l'utilisateur ou le schéma et réessayez l'opération.

Pour résoudre ce problème :

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

La CDC échoue après l’échec de ALTER COLUMN vers VARCHAR et VARBINARY

Lorsque le type de données d'une colonne d'un tableau compatible avec la CDC passe de TEXT à VARCHAR ou de IMAGE à VARBINARY et qu'une ligne existante est mise à jour avec une valeur hors ligne. Après la mise à jour, l’analyse CDC génère des erreurs.

Changements DDL dans les tables sources

La modification de la taille des colonnes d'une table CDC à l'aide d'instructions DDL peut entraîner des problèmes lors du processus de capture CDC suivant, ce qui entraîne 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 les sys.dm_cdc_errors indiquent que les analyses échouent en raison de l'erreur 2628 ou de l'erreur 8115 pour les tables de modification, vous devez d'abord consommer les données de modification dans les tables de modification concernées. Après cela, vous devez désactiver et réactiver la CDC sur la table pour résoudre efficacement le problème.

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 :

Category Description
Métadonnées modifiées Inclut des renseignements sur la façon d’atténuer les problèmes liés à la CDC lorsque la table déposée a été modifiée ou abandonné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 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 : 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 ou 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 lorsque l’utilisateur de la CDC 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 usurpé ou vous n’avez pas l’autorisation de le faire. 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 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 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 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 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 renvoie aucun objet, vous devez désactiver et réactiver la capture de données modifiées pour votre base de données. L’activation de la capture des données modifiié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 : l’utilisateur cdc a été supprimé du rôle de base de données db_owner ou du rôle serveur sysadmin.

  • Recommandation : vérifiez que l’utilisateur cdc a le 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.

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 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 913 : la tâche de saisie CDC échoue lors du traitement des modifications pour une table avec le type de données CLR du système

  • Cause : cette erreur se produit lorsque l’activation de la CDC sur une table avec le type de données CLR du système, que l’on apporte des modifications à la DML, puis que l’on apporte des modifications à la DDL sur la même table pendant que la tâche de capture de la 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 La tâche de capture de la CDC échoue lors du traitement des modifications.

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 l’appartenance aux rôles

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

Étapes suivantes