Share via


Problèmes connus et erreurs avec cdc

S’applique à :SQL ServerAzure SQL Managed Instance

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

Pour Azure SQL Database, consultez les problèmes connus liés à la capture de données modifiées dans Azure SQL Database.

Modification des métadonnées

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

Tous les objets dans sys.objects dont is_ms_shipped la propriété est définie 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 connaître une situation où vous avez des classements différents entre la base de données et les colonnes d’une table configurée pour la capture de données modifiées. La capture des changements de données utilise le stockage temporaire pour remplir les tables côté. 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 intermédiaires ne peuvent pas avoir de classements associés.

Envisagez l’une des approches suivantes pour vous assurer que les données modifiées capturées sont cohérentes avec les 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 de données modifiées (CDC) et de la récupération de base de données accélérée (ADR) n’est pas prise en charge. Lorsque vous activez la capture de données modifiées (CDC) sur SQL Server, 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 validée et la capture de données modifiées la rattrape, ou alors que la transaction soit interrompue. Cela peut entraîner différents problèmes, notamment le journal des transactions remplissant plus que d’habitude ou les opérations de données enregistrées dans la table latérale étant 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 pouvant être repris ne nécessite pas de conserver une transaction longue pour créer ou reconstruire un index, ce qui permet la troncation du journal pendant cette opération et une meilleure gestion de l’espace journal. Pour plus d’informations, consultez Recommandations pour les opérations d’index en ligne - Considérations relatives à l’index pouvant être reprise.

L’activation de la capture de données modifiées échoue si le schéma ou l’utilisateur nommé cdc existe déjà

Lorsque vous activez la capture de données modifiées sur une base de données, elle crée un schéma et un utilisateur nommé cdc. 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é à la capture de données modifiées, la procédure sys.sp_cdc_enable_db stockée système ne parvient pas à activer la capture de données modifiées sur la base de données avec le message d’erreur ci-dessous.

La base de données <database_name> ne peut pas être activée pour la capture de données modifiées, car un utilisateur de base de données nommé « cdc » ou un schéma nommé « cdc » existe déjà dans la base de données active. Ces objets sont requis exclusivement par 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 capture de données modifiées peut être activée avec succès sur la base de données.

La capture de données modifiées échoue après l’échec de ALTER COLUMN vers VARCHAR et VARBINARY

Lorsque le type de données d’une colonne sur une table avec capture de données modifiées est remplacé par TEXTVARCHAR ou IMAGE vers et qu’une ligne existante est mise à VARBINARY jour vers une valeur hors ligne. Après la mise à jour, l’analyse cdc génère des erreurs.

Modifications DDL apportées aux tables sources

La modification de la taille des colonnes d’une table avec capture de données modifiées à l’aide d’instructions DDL peut entraîner des problèmes avec le processus de capture cdc suivant, ce qui entraîne l’erreur 2628 ou l’erreur 8115. N’oubliez pas que les données des tables modifiées modifiées 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 cdc.

Si l’indication sys.dm_cdc_errors que les analyses échouent en raison de l’erreur 2628 ou de l’erreur 8115 pour les tables de modifications, vous devez d’abord utiliser les données modifiées dans les tables modifiées affectées. Après cela, vous devez désactiver et réactiver la capture de données modifiées 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 de la couche Données

Pour les bases de données SQL activées par capture de données MODIFIÉES, 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 dans la nouvelle base de données. Les autres objets CDC non inclus dans les opérations Import/Export et Extract/Deploy incluent les tables marquées comme is_ms_shipped=1 dans sys.objects.

Même si la capture de données modifiées 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 qui sera également exclu dans les opérations Import/Export et Extract/Deploy pour importer/configurer une nouvelle base de données.

Basculement de partition avec des variables

L’utilisation de variables avec basculement de partition sur des bases de données ou des tables avec capture de données modifié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 explique comment résoudre les erreurs associées à 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 sys.dm_cdc_errors vue de gestion dynamique retourne des erreurs, reportez-vous à 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 capture de données modifiées fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que CDC schemales tables modifiées, les procédures stockées système modifiées, les autorisations par défaut cdc user (sys.database_principals) ou renommer le cdc userfichier .

  • 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 capture de données modifiées fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que CDC schemales tables modifiées, les procédures stockées système modifiées, les autorisations par défaut cdc user (sys.database_principals) ou renommer le cdc userfichier .

  • 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 capture de données modifiées fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que CDC schemales tables modifiées, les procédures stockées système modifiées, les autorisations par défaut cdc user (sys.database_principals) ou renommer le cdc userfichier .

  • 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 de données modifiées fonctionne correctement, vous ne devez pas modifier manuellement les métadonnées CDC telles que CDC schemales tables modifiées, les procédures stockées système modifiées, les autorisations par défaut cdc user (sys.database_principals) ou renommer le cdc userfichier .

  • 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 de données/objets inutiles n’est pas une option, envisagez d’allouer davantage d’espace pour votre journal des transactions de base de données. Pour plus d’informations sur la gestion des journaux de transactions, consultez le guide d’architecture et de gestion du journal des transactions 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 capture de données modifiées pour une base de données ou d’une table, consultez Activer cdc pour une base de données et Activer la capture de données modifiées 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