Question

J'ai deux instances de SQL Server 2005 séparées géographiquement. Les bases de données importantes sont répliquées de l'emplacement principal vers l'emplacement secondaire à l'aide de la réplication transactionnelle.

Je cherche un moyen de surveiller cette réplication et d'être alerté immédiatement en cas d'échec.

Nous avons eu des occasions dans le passé où la connexion réseau entre les deux instances était interrompue pendant un certain temps. Comme la réplication ne pouvait pas se produire et que nous ne le savions pas, le journal des transactions a été vidé et rempli, ce qui a provoqué une panne de disque sur la base de données principale.

Ma recherche sur Google il y a quelque temps nous a amenés à surveiller la table MSrepl_errors et à alerter lorsqu'il y a des entrées, mais cela ne fonctionne tout simplement pas. La dernière fois que la réplication a échoué (la nuit dernière d'où la question), les erreurs ne se rencontrent que lors du redémarrage de la table.

Quelqu'un d'autre surveille-t-il la réplication et comment le fait-il?

Juste quelques informations supplémentaires:

Il semble que le problème, hier soir, soit que l'agent de lecture du journal est décédé et qu'il n'a pas redémarré. Je pense que cet agent est responsable de la lecture du journal des transactions et de la création d'enregistrements dans la base de données de distribution afin qu'ils puissent être répliqués sur le site secondaire.

Cet agent étant exécuté dans SQL Server, nous ne pouvons pas simplement nous assurer qu'un processus est en cours d'exécution dans Windows.

Était-ce utile?

La solution

Des courriels nous ont été envoyés pour des échecs de réplication de fusion. Je n'ai pas utilisé la réplication transactionnelle, mais j'imagine que vous pouvez configurer des alertes similaires.

Le moyen le plus simple consiste à le configurer via le moniteur de réplication.

Accédez au Moniteur de réplication et sélectionnez une publication particulière. Sélectionnez ensuite l'onglet Avertissements et agents, puis configurez l'alerte particulière que vous souhaitez utiliser. Dans notre cas, il s’agit de Replication: Agent Failure.

Pour cette alerte, la réponse est configurée pour exécuter un travail qui envoie un courrier électronique. Le travail peut également faire du travail pour inclure des détails sur ce qui a échoué, etc.

Cela fonctionne assez bien pour nous alerter du problème afin que nous puissions le résoudre tout de suite.

Autres conseils

Vous pouvez effectuer une vérification régulière de la modification des données, bien que cela puisse être complexe en fonction de votre application.

Si vous disposez d'une forme de table de train d'audit qui est mise à jour très régulièrement (notre produit principal dispose d'une table d'audit de base répertoriant toutes les actions qui entraînent la mise à jour ou la suppression de données), interrogez cette table sur les deux serveurs et assurez-vous que le résultat obtenu est identique. Quelque chose comme:

SELECT CHECKSUM_AGG(*) 
FROM   audit_base 
WHERE  action_timestamp BETWEEN <time1> AND BETWEEN <time2> 

où et sont des valeurs arrondies pour permettre différents délais de contact avec les bases de données. Par exemple, si vous vérifiez à 10 heures passées, vous pouvez vérifier les éléments depuis le début de la dernière heure jusqu'au début de cette heure. Vous avez maintenant deux petites valeurs que vous pouvez transmettre et comparer quelque part. Si elles sont différentes, le processus de réplication a probablement mal tourné: quel que soit le processus de vérification / comparaison, il vous envoie un courrier électronique et un SMS afin que vous sachiez vérifier et résoudre tout problème nécessitant votre attention.

En utilisant SELECT CHECKSUM_AGG (*), la quantité de données pour chaque table est très petite, de sorte que l'utilisation de la bande passante pour les contrôles sera insignifiante. Vous devez simplement vous assurer que vos contrôles ne sont pas trop coûteux dans la charge qui s'applique aux serveurs, et que vous ne vérifiez pas les données qui pourraient faire partie de transactions de réplication ouvertes, vous pourriez donc vous attendre à être différent à ce moment la piste de vérification quelques minutes en arrière au lieu de maintenant dans mon exemple), sinon vous aurez trop de fausses alarmes.

En fonction de la structure de votre base de données, il est possible que ce qui précède ne soit pas pratique. Pour les tables qui ne sont pas insérées uniquement (pas de mises à jour ou de suppressions) dans le délai imparti à votre contrôle (comme un audit audit comme ci-dessus), déterminer ce qui peut être comparé en toute sécurité tout en évitant les fausses alarmes risque d'être à la fois complexe et coûteux. pas réellement impossible à faire de manière fiable.

Vous pouvez créer une table roulante comportant uniquement des insertions si vous n'en avez pas déjà une en disposant d'une petite table (contenant uniquement une colonne d'horodatage indexée) à laquelle vous ajoutez régulièrement une ligne. Ces données ne servent à rien, elles existent afin que vous puissiez vérifier que les mises à jour de la table sont répliquées. Vous pouvez supprimer des données antérieures à votre fenêtre de vérification afin que la table ne devienne pas trop grande. Tester une seule table ne prouve pas que toutes les autres tables se répliquent (ni aucune autre table pour cette question), mais trouver une erreur dans cette seule table serait un bon "canery". check (si cette table ne se met pas à jour dans le réplica, les autres ne le seront probablement pas non plus).

Ce type de vérification présente l'avantage d'être indépendant du processus de réplication: vous n'attendez pas que le processus de réplication enregistre les exceptions dans les journaux, mais vous testez de manière proactive certaines des données réelles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top