Résolution des problèmes : Rechercher des erreurs dans la réplication transactionnelle SQL Server

S’applique à :SQL ServerAzure SQL Managed Instance

Le dépannage des erreurs de réplication peuvent être frustrant si vous n’avez pas une connaissance de base du fonctionnement de la réplication transactionnelle. La première étape de création d’une publication consiste à faire en sorte que l’Agent d’instantané crée l’instantané et l’enregistre dans le dossier des instantanés. Ensuite, l’Agent de distribution applique l’instantané à l’abonné.

Ce processus crée la publication et la place dans l’état En cours de synchronisation. La synchronisation fonctionne en trois phases :

  1. Des transactions se produisent sur des objets qui sont répliqués et sont marqués « pour réplication » dans le journal des transactions.
  2. L’Agent de lecture du journal parcourt le journal des transactions et recherche les transactions marquées « pour réplication ». Ces transactions sont ensuite enregistrées dans la base de données de distribution.
  3. L’Agent de distribution parcourt la base de données de distribution en utilisant le thread de lecture. Ensuite, en utilisant le thread d’écriture, cet agent se connecte à l’abonné pour lui appliquer ces modifications.

Des erreurs peuvent se produire à chaque étape de ce processus. La recherche de ces erreurs peut être l’aspect le plus complexe de la résolution des problèmes de synchronisation. Heureusement, l’utilisation du moniteur de réplication facilite ce processus.

Remarque

  • L’objectif de ce guide de dépannage est de vous faire découvrir la méthodologie de résolution des problèmes. Il n’est pas conçu pour résoudre une erreur spécifique, mais de façon à fournir des indications générales pour la recherche d’erreurs dans la réplication. Il contient quelques exemples spécifiques, mais leur résolution peut varier en fonction de l’environnement.
  • Les erreurs présentées à titre d’exemple dans ce guide sont basées sur le tutoriel Configuration de la réplication transactionnelle.

Méthodologie de résolution des erreurs

Questions à se poser

  1. Où la réplication échoue-t-elle dans le processus de synchronisation ?
  2. Quel agent rencontre une erreur ?
  3. Quand la dernière réplication a-t-elle fonctionné correctement ? Quelque chose a-t-il changé depuis lors ?

Étapes à suivre

  1. Utilisez le moniteur de réplication pour identifier à quel point la réplication rencontre l’erreur (quel agent ?) :
    • Si les erreurs se produisent dans la section Du serveur de publication vers le serveur de distribution, c’est que le problème concerne l’Agent de lecture du journal.
    • Si les erreurs se produisent dans la section Du serveur de distribution vers l’Abonné, c’est que le problème concerne l’Agent de distribution.
  2. Examinez l’historique des travaux de cet agent dans le moniteur d’activité des travaux pour identifier les détails de l’erreur. Si l’historique des travaux ne montre pas suffisamment de détails, vous pouvez activer la journalisation détaillée sur cet agent spécifique.
  3. Essayez de déterminer une solution pour l’erreur.

Rechercher des erreurs avec l’Agent d’instantané

L’Agent d’instantané génère l’instantané et l’écrit dans le dossier d’instantanés spécifié.

  1. Affichez l’état de votre Agent d’instantané :

    a. Dans l’Explorateur d’objets, développez le nœud Publications locales sous Réplication.

    b. Cliquez avec le bouton droit sur votre publication AdvWorksProductTrans>Afficher l’état de l’Agent d’instantané.

    Capture d’écran de la commande « Afficher l’état de l’Agent d’instantané » sur le menu contextuel.

  2. Si une erreur est signalée dans l’état de l’Agent d’instantané, vous pouvez trouver plus de détails dans l’historique des travaux de l’Agent d’instantané :

    a. Développez SQL Server Agent dans l’Explorateur d’objets, puis ouvrez le moniteur d’activité des travaux.

    b. Triez par Catégorie et identifiez l’Agent d’instantané dans la catégorie REPL-Instantané.

    c. Cliquez avec le bouton droit sur l’Agent d’instantané, puis choisissez Afficher l’historique.

    Capture d’écran des sélections pour l’ouverture de l’historique de l’Agent d’instantané.

  3. Dans l’historique de l’Agent d’instantané, sélectionnez l’entrée de journal appropriée. Il s’agit généralement d’une ou deux lignes avant l’entrée qui signale l’erreur. (Un X rouge indique des erreurs.) Passez en revue le texte du message dans la zone située sous les journaux :

    Capture d’écran de l’erreur de l’Agent d’instantané en raison d’un accès refusé.

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

Si vos autorisations Windows ne sont pas configurées correctement pour votre dossier d’instantanés, vous voyez une erreur « Accès refusé » pour l’Agent d’instantané. Vous devez vérifier les autorisations sur le dossier où votre instantané est stocké et vérifier que le compte utilisé pour exécuter l’Agent d’instantané dispose des autorisations d’accès au partage.

Rechercher les erreurs liées à l’Agent de lecture du journal

L’Agent de lecture du journal se connecte à la base de données de votre base de données du serveur de publication et recherche dans le journal des transactions toutes celles qui sont marquées « pour réplication ». Il ajoute ensuite ces transactions à la base de données de distribution.

  1. Connectez-vous à la publication dans SQL Server Management Studio. Développez le nœud du serveur, cliquez avec le bouton droit sur le dossier Réplication, puis sélectionnez Lancer le moniteur de réplication :

    Capture d’écran de la commande « Lancer le moniteur de réplication » du menu contextuel.

    Le Moniteur de réplication s’ouvre :

    Capture d’écran du moniteur de réplication.

  2. La croix (X) rouge indique que la publication ne se synchronise pas. Développez Mes serveurs de publication du côté gauche, puis développez le serveur de publication approprié.

  3. Sélectionnez la publication AdvWorksProductTrans sur la gauche, puis recherchez le X rouge sur un des onglets pour identifier l’emplacement du problème. En l’occurrence, le X rouge se trouve sur l’onglet Agents, indiquant qu’un des agents rencontre une erreur :

    Capture d’écran de Red X sous l’onglet « Agents » du Moniteur de réplication.

  4. Sélectionnez l’onglet Agents pour identifier l’agent qui rencontre l’erreur :

    Capture d’écran de Red X sur l’agent de lecture du journal défaillant dans le Moniteur de réplication.

  5. Cette vue vous montre deux agents : l’Agent d’instantané et l’Agent de lecture du journal. Celui qui rencontre une erreur a un X rouge. En l’occurrence, il s’agit de l’Agent de lecture du journal.

    Double-cliquez sur la ligne qui signale l’erreur pour ouvrir l’historique de l’agent pour l’Agent de lecture du journal. Celui-ci fournit plus d’informations sur l’erreur :

    Capture d’écran des détails de l’erreur pour l’Agent de lecture du journal.

    Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.
    Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'.
    Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.        
    
  6. L’erreur se produit généralement quand le propriétaire de la base de données du serveur de publication n’est pas défini correctement. Ceci peut se produire quand une base de données est restaurée. Pour vérifier cela :

    a. Développez Bases de données dans l’Explorateur d’objets.

    b. Cliquez avec le bouton droit sur AdventureWorks2022>Propriétés.

    c. Vérifiez qu’un propriétaire existe sous la page Fichiers. Si cette zone est vide, ceci est la cause probable de votre problème.

    Capture d’écran de la page « Fichiers » des propriétés de la base de données, avec une case « Propriétaire » vide.

  7. Si le propriétaire est vide sur la page Fichiers, ouvrez une fenêtre Nouvelle requête dans le contexte de la base de données AdventureWorks2022. Exécutez le code T-SQL suivant :

    -- set the owner of the database to 'sa' or a specific user account, without the brackets. 
    EXECUTE sp_changedbowner '<useraccount>'
    -- example for sa: exec sp_changedbowner 'sa'
    -- example for user account: exec sp_changedbowner 'sqlrepro\administrator' 
    
  8. Il peut être nécessaire de redémarrer l’Agent de lecture du journal.

    a. Développez le nœud SQL Server Agent dans l’Explorateur d’objets, puis ouvrez le moniteur d’activité des travaux.

    b. Triez par Catégorie et identifiez l’Agent de lecture du journal dans la catégorie REPL-LogReader.

    c. Cliquez avec le bouton droit sur le travail Agent de lecture du journal et sélectionnez Démarrer le travail à l’étape.

    Capture d’écran des sélections pour redémarrer l’Agent de lecture du journal.

  9. Vérifiez que votre publication est maintenant en cours de synchronisation en rouvrant le moniteur de réplication. S’il n’est pas déjà ouvert, vous pouvez le trouver en cliquant avec le bouton droit sur Réplication dans l’Explorateur d’objets.

  10. Sélectionnez la publication AdvWorksProductTrans, sélectionnez l’onglet Agents, puis double-cliquez sur l’Agent de lecture du journal pour ouvrir l’historique de l’agent. Vous devez maintenant voir que l’Agent de lecture du journal est en cours d’exécution, et qu’il réplique des commandes ou qu’il indique « aucune transaction répliquée » :

    Capture d’écran de l’Agent de lecture du journal en cours d’exécution sans transaction répliquée.

Rechercher les erreurs avec l’Agent de distribution

L’Agent de distribution recherche des données dans la base de données de distribution, puis les applique à l’abonné.

  1. Connectez-vous à la publication dans SQL Server Management Studio. Développez le nœud du serveur, cliquez avec le bouton droit sur le dossier Réplication, puis sélectionnez Lancer le moniteur de réplication.

  2. Dans Moniteur de réplication, sélectionnez la publication AdvWorksProductTrans, puis l’onglet Tous les abonnements. Cliquez avec le bouton droit sur l’abonnement et sélectionnez Voir les détails :

    Capture d’écran de la commande « Afficher les détails » dans le menu contextuel.

  3. La boîte de dialogue Historique du serveur de distribution vers l’Abonné s’ouvre et donne des indications sur l’erreur rencontrée par l’Agent :

    Capture d’écran des détails de l’erreur pour l’Agent de distribution.

    Error messages:
    Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
    
  4. L’erreur indique que l’Agent de distribution fait une nouvelle tentative. Pour trouver plus d’informations, consultez l’historique de l’Agent de Distribution :

    a. Développez SQL Server Agent dans Explorateur d'objets >Moniteur d’activité des travaux.

    b. Triez les travaux par Catégorie.

    c. Identifiez l’Agent de distribution dans la catégorie REPL-Distribution. Cliquez avec le bouton droit sur l’agent, puis sélectionnez Afficher l’historique.

    Capture d’écran des sélections pour l’affichage de l’historique de l’Agent de distribution.

  5. Sélectionnez une des entrées d’erreur et consultez le texte de l’erreur en bas de la fenêtre :

    Capture d’écran du texte d’erreur qui indique un mot de passe incorrect pour l’Agent de distribution.

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. Cette erreur indique que le mot de passe utilisé par l’Agent de distribution est incorrect. Pour la résoudre :

    a. Développez le nœud Réplication dans l’Explorateur d’objets.

    b. Cliquez avec le bouton droit sur l’abonnement >Propriétés.

    c. Sélectionnez les points de suspension (...) à côté de Compte de processus de l’agent, puis modifiez le mot de passe.

    Capture d’écran des sélections pour modifier le mot de passe pour l’Agent de Distribution.

  7. Revenez au moniteur de réplication en cliquant avec le bouton droit sur Réplication dans l’Explorateur d’objets. Une croix (X) rouge sous Tous les abonnements indique que l’Agent de distribution rencontre encore une erreur.

    Ouvrez l’historique Du serveur de distribution vers l’Abonné en cliquant avec le bouton droit sur l’abonnement dans Moniteur de réplication>Afficher les détails. Ici, l’erreur est désormais différente :

    Capture d’écran de l’erreur indiquant que l’Agent de distribution ne peut pas se connecter.

    Connecting to Subscriber 'NODE2\SQL2016'        
    Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'.
    Number:  18456
    Message: Login failed for user 'NODE2\repl_distribution'.
    
  8. Cette erreur indique que l’Agent de distribution n’a pas pu se connecter à l’abonné, car la connexion a échoué pour l’utilisateur NODE2\repl_distribution. Pour en savoir plus, connectez-vous à l’abonné et ouvrez le journal des erreurs SQL Actuel sous le nœud Gestion dans l’Explorateur d’objets :

    Capture d’écran de l’erreur indiquant que la connexion a échoué pour l’abonné.

    Si vous voyez cette erreur, c’est que la connexion est manquante sur l’abonné. Pour résoudre cette erreur, consultez Autorisations pour la réplication.

  9. Une fois que l’erreur de connexion est résolue, revenez au moniteur de réplication. Si tous les problèmes ont été traités, vous devez voir une flèche verte à côté de Nom de la publication et l’état En cours d’exécution sous Tous les abonnements.

    Cliquez avec le bouton droit sur l’abonnement pour rouvrir l’historique Du serveur de distribution vers l’Abonné afin de vérifier que tout est résolu. S’il s’agit de la première exécution de l’Agent de distribution, vous pouvez constater que l’instantané a été copié en bloc vers l’Abonné :

    Capture d’écran de l’agent de distribution avec un état « En cours d’exécution » et un message sur la copie en bloc.

Activer la journalisation détaillée sur un agent

Vous pouvez utiliser la journalisation détaillée pour voir des informations plus détaillées sur les erreurs qui se produisent avec n’importe quel agent dans la topologie de réplication. Les étapes sont identiques pour chaque agent. Veillez simplement à sélectionner l’agent approprié dans le moniteur d’activité des travaux.

Remarque

Les agents peuvent être sur le serveur de publication ou sur l’abonné, selon s’il s’agit d’un abonnement par extraction ou par émission de données. Si l’agent n’est pas disponible sur le serveur que vous examinez, vérifiez l’autre serveur.

  1. Décidez où vous voulez que la journalisation détaillée soit enregistrée et vérifiez que le dossier existe. Cet exemple utilise c:\temp.

  2. Développez le nœud SQL Server Agent dans l’Explorateur d’objets, puis ouvrez le moniteur d’activité des travaux.

    Capture d’écran de la commande « Afficher l’activité du travail » dans le menu contextuel pour le moniteur d’activité des travaux.

  3. Triez par Catégorie et identifiez l’agent concerné. Cet exemple utilise l’Agent de lecture du journal. Cliquez avec le bouton droit sur l’agent concerné >Propriétés.

    Capture d’écran des sélections pour ouvrir les propriétés de l’agent.

  4. Sélectionnez la page Étapes, puis sélectionnez l’étape Exécution de l’agent. Sélectionnez Modifier.

    Capture d’écran des sélections pour la modification de l’étape « Exécution de l’agent ».

  5. Dans la zone Commande, commencez une nouvelle ligne, entrez le texte suivant et sélectionnez OK :

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    Vous pouvez modifier l’emplacement et le niveau de détail selon vos préférences.

    Capture d’écran de la sortie détaillée dans les propriétés de l’étape de travail.

    Remarque

    Lorsque vous ajoutez le paramètre de sortie verbeuse, les éléments suivants peuvent entraîner l'échec de votre agent ou l'absence du fichier outfile :

    • Il existe un problème de mise en forme là où le tiret est devenu un trait d’union.
    • L’emplacement n’existe pas sur le disque ou le compte qui exécute l’agent ne dispose pas d’autorisation d’écrire à l’emplacement spécifié.
    • Il manque un espace entre le dernier paramètre et le paramètre -Output.
    • Les différents agents prennent en charge des niveaux de détail différents. Si vous activez la journalisation détaillée mais que l’agent ne démarre pas, essayez en réduisant le niveau de détail de 1.
  6. Redémarrez l’Agent de lecture du journal en double-cliquant sur l’agent >Arrêter le travail à l’étape. Actualisez en sélectionnant l’icône Actualiser dans la barre d’outils. Cliquez avec le bouton droit sur l’agent >Démarrer le travail à l’étape.

  7. Examinez la sortie sur le disque.

    Capture d’écran du fichier texte de sortie.

  8. Pour désactiver la journalisation détaillée, suivez les mêmes étapes que précédemment pour supprimer l’ensemble de la ligne -Output que vous avez ajoutée auparavant.

Obtenir de l’aide

Contribuer à la documentation SQL

Saviez-vous que vous pouvez modifier le contenu SQL vous-même ? Dans ce cas, non seulement vous nous aidez à améliorer notre documentation, mais vous êtes également cité en tant que contributeur à la page.

Pour plus d’informations, consultez Guide pratique pour contribuer à la documentation SQL Server