Comment obtenir des notifications en temps réel, lorsqu'un changement de base de données (insertion, mise à jour, suppression) se produit?

13

Je crée un tableau de bord qui devrait surveiller une table de base de données. Je n'ai qu'un accès à la base de données (pas de couche d'application). Le tableau est assez volumineux (10 millions de lignes), mais ne change pas rapidement (100 insertions / mises à jour par minute)

Comment savoir si la table a changé? J'essaierais de toucher la base de données chaque seconde, mais cela semble être une approche par force brute ...

Bases de données: MySQL / Postgres

Kiril
la source
Cela pourrait être utile . Nous l'utilisons pour surveiller notre batterie de serveurs. Je suis sûr que cela aura la fonctionnalité de suivre un changement de table dans DB. Malheureusement, nous n'avons pas configuré jusqu'au niveau de la table. Donc, je ne suis pas au courant de la configuration jusqu'au niveau de la table.
Jude Niroshan
Merci pour le commentaire. Mais comment les nagios peuvent-ils aider? Je n'ai qu'un accès à la base de données. Je ne peux rien installer sur des machines distantes.
Kiril
3
Voulez-vous vraiment être averti - en temps réel - chaque fois qu'une ligne est insérée ou mise à jour? Détrompez-vous.
Tulains Córdova
Y a-t-il une raison valable pour laquelle vous n'avez pas de couche d'application? Il me semble que c'est la meilleure façon de faire les choses, c'est-à-dire d'avoir une couche d'application qui gère la surveillance. Par exemple, l'envoi d'e-mails à partir du serveur de base de données ne ressemble pas à une architecture propre.
juhist
J'ai un petit plugin mysql qui fait ça: github.com/Cyclonecode/mysql-notification
Cyclonecode

Réponses:

9

Vous pouvez utiliser des déclencheurs.

CREATE TRIGGER notifyMe
ON table1
AFTER INSERT, UPDATE, DELETE 
AS
   EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'DB AutoMailer',
        @recipients = '[email protected]',
        @body = 'The DB has changed',
        @subject = 'DB Change';
GO
stechray
la source
Je ne suis pas sûr que ce serait mieux que de frapper la base de données toutes les secondes, ou enverriez-vous toute la modification dans le courrier et laissez-vous le logiciel du tableau de bord analyser l'e-mail?
Kiril
1
Vous pouvez obtenir les valeurs modifiées spécifiques en sélectionnant dans les tables «insérées», «mises à jour» et «supprimées», et vous pouvez ajouter les identifiants au corps.
stechray
2
Au lieu d'envoyer des e-mails, vous pouvez également appeler une procédure stockée qui se connecte à une API Web prise en charge par le tableau de bord. Voir ici pour plus de détails: forums.asp.net/t/…
stechray
3
Ou demandez aux déclencheurs de placer les données dans une table supplémentaire que vous interrogez (et videz) aux intervalles que vous souhaitez. Pas techniquement «en temps réel», mais peut ressembler à ça.
Jan Doggen du
1
Demandez au déclencheur de pousser les informations de mise à jour dans une file d'attente (ou rubrique) sur un courtier de messagerie. Cela a toujours été mon approche préférée. De cette façon, vous n'avez pas de logique complexe dans le déclencheur et vous avez beaucoup de flexibilité avec ce que vous faites avec le message lorsque vous le recevez. Et si vous passez à un sujet pub / sous, vous pouvez même avoir plusieurs consommateurs le recevant et faisant différentes choses avec.
mindcrime
3

Pour PostgreSQL, je connais un moyen d'obtenir une notification de la base de données quand une ligne change.

  1. utilisez le déclencheur lorsque l'insertion / la mise à jour / la suppression se produit.
  2. lorsqu'un événement se produit, envoyez une notification à un socket client.
  3. assurez-vous que votre application dispose d'un client sur le serveur.
  4. votre application recevra alors une notification.

Vous pouvez voir mon code ou la documentation de PostgreSQL .

Il semble que la notification ne soit pas fiable, mais au moins cela fonctionne pour moi.

user275831
la source
Belle approche. Il s'agit essentiellement d'un déclencheur personnalisé?
Kiril