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 schema
les 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 user
fichier .
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’utilisateurcdc
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 TEXT
VARCHAR
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 schema
les tables modifiées, les procédures stockées système modifiées, les autorisations par défautcdc user
(sys.database_principals
) ou renommer lecdc user
fichier .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 schema
les tables modifiées, les procédures stockées système modifiées, les autorisations par défautcdc user
(sys.database_principals
) ou renommer lecdc user
fichier .Recommandation : vérifiez que l’utilisateur
cdc
existe dans votre base de données et dispose également du rôledb_owner
attribué. Pour créer l’utilisateurcdc
, 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 queCDC schema
les tables modifiées, les procédures stockées système modifiées, les autorisations par défautcdc user
(sys.database_principals
) ou renommer lecdc user
fichier .Recommandation : vérifiez que l’utilisateur
cdc
existe dans votre base de données et dispose également du rôledb_owner
attribué. Pour créer l’utilisateurcdc
, 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 schema
les tables modifiées, les procédures stockées système modifiées, les autorisations par défautcdc user
(sys.database_principals
) ou renommer lecdc user
fichier .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éesdb_owner
ou du rôle serveursysadmin
.Recommandation : vérifiez que l’utilisateur
cdc
a le rôledb_owner
attribué. Pour créer l’utilisateurcdc
, 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
- Pour obtenir une vue d’ensemble de cdc pour SQL Server, consultez Qu’est-ce que la capture de données modifiées (CDC) ?
- Pour plus d’informations sur les problèmes connus et les limitations de capture de données modifiées avec Azure SQL Database, consultez problèmes connus et limitations de capture de données modifiées avec Azure SQL Database
- Pour plus d’informations sur l’activation et la désactivation des captures de données modifiées, consultez Activer et désactiver la capture de données modifiées
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour