Database
 sql >> Base de données >  >> RDS >> Database

Suivi au niveau des colonnes et des lignes dans la réplication de fusion

Dans cet article, examinons les options de suivi au niveau des lignes et des colonnes dans la réplication de fusion et comment elles sont utilisées pour détecter les conflits lors de la réplication de fusion.

Fusionner la réplication : La réplication de fusion est utilisée pour répliquer les données dans les deux sens, c'est-à-dire de l'éditeur vers l'abonné et de l'abonné vers l'éditeur.

L'instantané initial des objets est pris et appliqué aux abonnés. Les modifications de données incrémentielles et les modifications de schéma sont suivies à l'aide de déclencheurs et appliquées aux abonnés lorsque l'abonné se synchronise avec l'éditeur.

Conflits :

Dans la réplication de fusion, l'abonné et l'éditeur sont indépendants et les données peuvent être modifiées sur n'importe quel nœud.

Lorsque des données sont modifiées à la fois sur l'éditeur et l'abonné dans le cycle de réplication, et lorsque l'abonné se synchronise avec l'éditeur, un conflit se produit. L'agent de fusion détermine le gagnant des deux côtés en fonction du résolveur de conflit. Par défaut, le gagnant est déterminé par différents paramètres tels qu'un abonnement client ou serveur, un abonnement pull ou push, etc.

Détection des conflits :

La détection de conflit dépend du type de suivi que nous configurons pour l'article.

  • Suivi au niveau de la ligne : Si des modifications de données sont apportées à une colonne de la même ligne aux deux extrémités, cela est considéré comme un conflit.
  • Suivi au niveau des colonnes : Si des modifications de données sont effectuées sur la même colonne aux deux extrémités, cette modification est qualifiée de conflit.

Résolveurs :

Les résolveurs appliquent les données gagnantes aux deux extrémités lorsqu'un conflit se produit.

Par défaut, s'il y a un conflit entre l'éditeur et l'abonné, l'éditeur gagne toujours.

Si un conflit survient entre deux abonnés, le gagnant est déterminé par l'abonné client/serveur et les abonnements pull/push.

Outre le résolveur par défaut, il existe également quelques résolveurs personnalisés. Nous discuterons des résolveurs personnalisés dans les prochains articles.

Configurer la réplication de fusion avec le suivi au niveau des lignes :

Base de données de l'éditeur :pub_db

Base de données des abonnés :sub_db

Créons la table "TBL_EMP" et ajoutons-la à la réplication de fusion.

CREATE TABLE TBL_EMP
(EmpID INT, Emp_FName varchar(100),Emp_Lname varchar(100))

INSERT INTO TBL_EMP VALUES (1,'Jhon','P')

INSERT INTO TBL_EMP VALUES (2,'Alison','P')

INSERT INTO TBL_EMP VALUES (3,'Angela','P')

Pour configurer la réplication de fusion, l'éditeur doit être configuré pour utiliser la distribution locale ou la distribution à distance.

Une fois la distribution configurée, accédez au dossier de réplication dans SSMS et cliquez avec le bouton droit sur les publications locales.

Cliquez sur Suivant et sélectionnez la base de données de publication, cliquez sur Suivant et sélectionnez la réplication de fusion, sélectionnez 2008 ou version ultérieure et ajoutez la table à la réplication.

Cliquez maintenant sur les propriétés de l'article et sélectionnez les propriétés de l'article en surbrillance.

Sélectionnez le niveau de suivi comme suivi au niveau de la ligne.

Par défaut, ce sera le suivi au niveau de la ligne. Cliquez sur OK, Suivant, Suivant . Ajoutez un filtre si vous souhaitez envoyer des données spécifiques à l'abonné, sinon ignorez, activez Créer instantanéimmédiatement , configurez la sécurité de l'agent selon vos besoins, activez Créer une publication , indiquez le nom de la publication et cliquez sur Terminer .

Une fois l'instantané initial généré, ajoutez l'abonné.

Accédez à la publication que vous créez dans le dossier de réplication sur l'éditeur, cliquez avec le bouton droit et sélectionnez Nouvel abonnement.

Cliquez sur Suivant , sélectionnez la publication, cliquez sur Suivant et sélectionnez l'abonnement pull ou push selon vos besoins. Dans ce cas, j'ai utilisé l'abonnement push.

Sélectionnez la base de données d'abonnement et cliquez sur Suivant , configurez les identifiants de connexion pour l'agent de fusion, puis cliquez sur Suivant .

Choisissez l'horaire de l'agent selon vos besoins. Dans ce cas, j'ai utilisé Exécuter à la demande uniquement . Cliquez sur Suivant , sélectionnez Initialiser immédiatement et sélectionnez client comme type d'abonnement, cliquez sur Suivant , activez Créer un abonnement , cliquez sur Suivant et Terminer .

Une fois l'instantané initial appliqué, exécutez la déclaration ci-dessous sur l'éditeur pour mettre à jour l'enregistrement.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 1

Maintenant, sur la base de données de l'abonné, exécutez l'instruction ci-dessous pour mettre à jour le nom de famille.

update TBL_EMP set Emp_Lname = 'A' where empid = 1

Désormais, la même ligne a été modifiée à la fois dans la base de données de l'éditeur et dans la base de données des abonnés au cours du même cycle de réplication.

Selon l'option de suivi que nous avons définie, c'est-à-dire le suivi au niveau des lignes, la modification est considérée comme un conflit et sera enregistrée dans les tables de conflits lors de l'exécution de l'agent de fusion.

Accédez à la publication que vous avez créée et développez la publication pour voir les abonnements. Cliquez avec le bouton droit sur l'abonnement, sélectionnez Afficher l'état de la synchronisation, puis cliquez sur Démarrer.

Une fois l'agent de fusion exécuté avec succès, accédez à l'abonné et vérifiez les données à l'aide de l'instruction ci-dessous.

use sub_db
select * from TBL_EMP  where empid = 1 

Nous pouvons voir que le changement de l'éditeur a gagné et que le changement de l'abonné a perdu.

Les informations sur les conflits sont stockées dans les tables de conflits et peuvent être consultées dans la visionneuse de conflits.

Accédez à l'éditeur, cliquez dessus avec le bouton droit de la souris et sélectionnez Afficher les conflits.

Sélectionnez la table des conflits et cliquez sur OK pour afficher les détails.

Modifier le niveau de suivi

Changeons maintenant le niveau de suivi en suivi au niveau des colonnes. Accédez à la publication, cliquez dessus avec le bouton droit de la souris et sélectionnez Propriétés de l'éditeur. Cliquez sur Articles, sélectionnez le tableau, cliquez sur Propriétés de l'article, définissez les propriétés de l'article du tableau en surbrillance, sélectionnez Suivi au niveau de la colonne, cliquez sur OK, cliquez sur OK, puis cliquez sur Marquer pour réinitialisation.

Cela marquera tous les abonnés pour la réinitialisation car nous changeons le niveau de suivi existant en un nouveau.

Accédez à la publication, cliquez dessus avec le bouton droit de la souris et cliquez sur Afficher le statut de l'agent d'instantané , cliquez sur Démarrer pour générer un nouvel instantané. Il existe également d'autres façons de générer un instantané.

Maintenant, exécutez la déclaration ci-dessous contre l'éditeur pour mettre à jour un enregistrement.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 2

Maintenant, exécutez l'instruction ci-dessous sur la base de données de l'abonné pour mettre à jour le nom de famille.

update TBL_EMP set Emp_Lname = 'A' where empid = 2

Exécutez l'agent de fusion manuellement. Je vois toujours le conflit dans l'enregistrement même si nous avons mis à jour deux colonnes différentes et défini le niveau de suivi au niveau de la colonne.

Nous pouvons voir les détails dans la visionneuse de conflits. La modification du niveau de suivi existant n'a pas fonctionné. J'ai donc reconfiguré la publication, défini le niveau de suivi sur le suivi au niveau de la colonne avant de générer l'instantané initial. Un instantané a été créé et un abonné a été ajouté à la publication.

Une fois l'instantané initial appliqué à l'abonné, exécutez les instructions suivantes dans la base de données de l'éditeur.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 3

Exécutez l'instruction suivante dans la base de données des abonnés.

update TBL_EMP set Emp_Lname = 'A' where empid = 3

Exécutez l'agent de fusion manuellement. Maintenant, dans la base de données des abonnés, interrogez la table TBL_EMP.

La mise à jour de l'éditeur et de l'abonné n'est pas considérée comme un conflit car les deux se trouvent sur des colonnes différentes et le niveau de suivi est défini sur le suivi au niveau de la colonne. Aucun conflit n'est enregistré dans les tables de conflits, les mises à jour sur l'éditeur et l'abonné sur différentes colonnes ne sont pas perdues.

Mettons à jour la même colonne sur l'éditeur et l'abonné.

Exécutez l'instruction suivante sur la base de données de l'éditeur.

use pub_db
update TBL_EMP set Emp_Lname = 'B' where empid = 1

Exécutez l'instruction suivante sur la base de données des abonnés.

use sub_db
update TBL_EMP set Emp_Lname = 'C' where empid = 1

Exécutez l'agent de fusion et interrogez la table TBL_EMP sur l'abonné. La mise à jour sur l'abonné est perdue et le conflit est consigné.

Performances :

Il peut y avoir une surcharge de performances avec le suivi au niveau des colonnes par rapport au suivi au niveau des lignes lorsqu'il y a d'énormes mises à jour. Mais dans mon cas, je n'ai remarqué aucune différence dans les délais de synchronisation pour le suivi au niveau des lignes et des colonnes en cas de mises à jour volumineuses, car le tableau peut être de structure simple (c'est-à-dire très peu de colonnes) et à la fois l'abonné et le éditeur sont sur la même instance de serveur SQL.

Remarques :

  • Par défaut, il s'agit toujours du suivi au niveau des lignes lorsque la réplication de fusion est configurée.
  • L'option de niveau de suivi dépend d'une table. Ainsi, vous pouvez avoir un niveau ligne sur une table et un niveau colonne sur une autre table.
  • Ces options ne sont utiles que lorsqu'un conflit est détecté sur la base d'une mise à jour, pas pour le résoudre.
  • Reconfigurez la publication si la modification du niveau de suivi existant ne fonctionne pas.
  • Définissez le niveau de suivi en fonction des besoins de votre entreprise.