Erreur 1205 lors de la configuration de la réplication transactionnelle
Cet article vous aide à résoudre un problème qui se produit lorsque vous configurez la réplication transactionnelle dans SQL Server.
Version du produit d’origine : SQL Server
Numéro de la base de connaissances d’origine : 2674882
Symptômes
Prenons l’exemple du scénario suivant :
- Vous configurez la réplication transactionnelle dans SQL Server.
- La topologie de réplication transactionnelle se compose de plusieurs serveurs de publication.
- Les éditeurs répliquent les données dans la même base de données d’abonné.
- Les agents de distribution s’exécutent en continu ou s’exécutent selon une planification fréquente. Par exemple, les agents de distribution s’exécutent toutes les minutes.
Dans ce scénario, les agents de distribution peuvent être impliqués dans un scénario d’interblocage et peuvent être sélectionnés comme victimes d’interblocage. Lorsque ce problème se produit, vous pouvez recevoir un message d’erreur semblable au suivant :
Erreur 1205
La transaction (ID de processus %d) a été bloquée sur les ressources %.*ls avec un autre processus et a été choisie comme victime de l’interblocage. Réexécutez la transaction.
Si vous activez l’indicateur de trace 1222 pour rediriger les informations d’interblocage dans le journal des erreurs SQL Server, vous recevez un message d’erreur semblable à l’un des suivants :
-
update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp) quand 16 then isnull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), « time » = @P2 where UPPER(publisher) = UPPER(@P3) et publisher_db = @P4 and publication = @P5 and subscription_type = 0
-
update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(substring(transaction_timestamp, 16, 1) as binary(1)), « time » = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and and subscription_type = 0 et (substring(transaction_timestamp, 16, 1) = 0 ou datalength(transaction_timestamp) < 16)
Cause
Ce problème se produit si l’estimation du nombre de lignes pour la table système de nombres MSreplication_subscriptions
est incorrecte. Si l’estimation du nombre de lignes est incorrecte, le moteur de base de données SQL Server peut utiliser une méthode incorrecte pour mettre à jour la base de données.
Remarque
En règle générale, l’estimation correcte du nombre de lignes est égale au nombre d’abonnements dans la base de données. Si vous utilisez la fonctionnalité Flux d’abonnement, l’estimation du nombre de lignes est égale au nombre d’abonnements multiplié par le nombre de flux configurés pour chaque abonnement.
Résolution
Pour résoudre ce problème, appliquez l’une des méthodes suivantes.
Méthode 1 : utilisez la
DBCC UPDATEUSAGE
commande .Pour résoudre ce problème, mettez à jour la valeur rowcount incorrecte. Pour ce faire, exécutez la commande suivante :
DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
Remarque
La
DBCC UPDATEUSAGE
commande détermine les valeurs correctes pour les lignes, les pages utilisées, les pages réservées, les pages feuilles et le nombre de pages de données pour chaque partition d’une table. Si ces valeurs sont correctes, laDBCC UPDATEUSAGE
commande ne retourne aucune donnée. Si des valeurs inexactes sont trouvées et corrigées,DBCC UPDATEUSAGE
retourne les lignes et les colonnes qui sont mises à jour.Méthode 2 : utilisez l’instruction
ALTER INDEX
.Pour résoudre ce problème, régénérez les index associés à la
MSreplication_subscriptions
table. Pour ce faire, utilisez l’instruction suivante :ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
Plus d’informations
Lorsque le problème mentionné dans la section Symptômes se produit, l’estimation du nombre de lignes pour la MSreplication_subscriptions
table système peut être aussi élevée que 4 294 967 296. Pour case activée la valeur rowcount, utilisez l’une des méthodes suivantes.
Méthode 1 : utiliser SQL Server Management Studio.
Pour utiliser SQL Server Management Studio afin de case activée la valeur rowcount de la
MSreplication_subscriptions
table système, procédez comme suit :- Démarrez SQL Server Management Studio, puis connectez-vous au serveur abonné instance.
- Développez Bases de données, puis développez la base de données de l’abonné.
- Développez Tables, puis Tables système.
- Cliquez avec le bouton droit sur dbo. MSreplication_subscriptions, puis sélectionnez Propriétés.
- Sélectionnez Stockage, puis vérifiez la valeur rowcount dans le champ Nombre de lignes .
Méthode 2 : utiliser une instruction de requête.
Pour case activée la valeur rowcount de la
MSreplication_subscriptions
table système, exécutez la requête suivante :SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
References
- Pour plus d’informations sur la détection et la fin des interblocages, consultez Détection et fin des interblocages
- Pour plus d’informations sur l’instruction
ALTER
, consultez Instructions Transact-SQL - Pour plus d’informations sur la
DBCC UPDATEUSAGE
commande, consultez DBCC UPDATEUSAGE (Transact-SQL).
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