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, la DBCC 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 :

    1. Démarrez SQL Server Management Studio, puis connectez-vous au serveur abonné instance.
    2. Développez Bases de données, puis développez la base de données de l’abonné.
    3. Développez Tables, puis Tables système.
    4. Cliquez avec le bouton droit sur dbo. MSreplication_subscriptions, puis sélectionnez Propriétés.
    5. 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