Wie erhalte ich Benachrichtigungen in Echtzeit, wenn eine Datenbankänderung (Einfügen, Aktualisieren, Löschen) auftritt?

12

Ich erstelle ein Dashboard, das eine Datenbanktabelle überwachen soll. Ich habe nur Datenbankzugriff (keine Anwendungsebene). Die Tabelle ist ziemlich groß (10 Millionen Zeilen), ändert sich jedoch nicht schnell (100 Einfügungen / Aktualisierungen pro Minute).

Wie kann ich herausfinden, ob sich die Tabelle geändert hat? Ich würde versuchen, jede Sekunde die Datenbank zu durchsuchen, aber dies scheint ein brachialer Ansatz zu sein ...

Datenbanken: MySQL / Postgres

Kiril
quelle
Das könnte hilfreich sein . Wir verwenden dies, um unsere Serverfarm zu überwachen. Ich bin mir ziemlich sicher, dass dies die Funktion haben wird, um eine Tabellenänderung in der Datenbank zu verfolgen. Leider haben wir nicht auf Tabellenebene konfiguriert. Daher ist es mir nicht bewusst, bis zur Tabellenebene zu konfigurieren.
Jude Niroshan
Danke für den Kommentar. Aber wie kann Nagios helfen? Ich habe nur Datenbankzugriff. Ich kann nichts auf entfernten Rechnern installieren.
Kiril
3
Möchten Sie wirklich jedes Mal in Echtzeit benachrichtigt werden, wenn eine Zeile eingefügt oder aktualisiert wird? Denk nochmal.
Tulains Córdova
Gibt es einen triftigen Grund, warum Sie keine Anwendungsschicht haben? Es scheint mir der beste Weg zu sein, Dinge zu tun, dh eine Anwendungsebene zu haben, die die Überwachung übernimmt. Beispielsweise sieht das Senden von E-Mails vom Datenbankserver nicht nach einer sauberen Architektur aus.
Juhist
Ich habe ein kleines MySQL-Plugin, das dies tut: github.com/Cyclonecode/mysql-notification
Cyclonecode

Antworten:

9

Sie können Trigger verwenden.

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
quelle
Ich bin mir nicht sicher, ob dies besser wäre, als jede Sekunde auf die Datenbank zuzugreifen, oder ob Sie die gesamte Änderung per E-Mail senden und die E-Mail von der Dashboard-Software analysieren lassen würden.
Kiril
1
Sie können die spezifischen geänderten Werte abrufen, indem Sie aus den Tabellen 'insert', 'updated' und 'deleted' auswählen und die IDs zum Hauptteil hinzufügen.
stechray
2
Anstatt E-Mails zu senden, können Sie auch eine gespeicherte Prozedur aufrufen, die eine Verbindung zu einer vom Dashboard unterstützten Web-API herstellt. Einzelheiten finden Sie hier: forums.asp.net/t/…
stechray
3
Oder lassen Sie die Trigger Daten in einer zusätzlichen Tabelle ablegen, die Sie dann in von Ihnen gewünschten Intervallen abfragen (und leeren). Nicht technisch "in Echtzeit", kann aber so aussehen.
Jan Doggen
1
Lassen Sie den Auslöser die Aktualisierungsinformationen in eine Warteschlange (oder ein Thema) auf einem Messaging-Broker verschieben. Dies war schon immer mein Lieblingsansatz. Auf diese Weise haben Sie keine komplexe Logik im Auslöser, und Sie haben viel Flexibilität in Bezug auf das, was Sie mit der Nachricht tun, wenn Sie sie empfangen. Und wenn Sie zu einem Pub- / Unterthema wechseln, können Sie sogar mehrere Konsumenten dazu bringen, es zu empfangen und verschiedene Dinge damit zu tun.
Geisteskriminalität
3

Für PostgreSQL kenne ich eine Möglichkeit, Benachrichtigungen von der Datenbank zu erhalten, wenn sich eine Zeile ändert.

  1. Trigger verwenden, wenn Einfügen / Aktualisieren / Löschen erfolgt.
  2. Wenn ein Ereignis eintritt, senden Sie eine Benachrichtigung an einen Client-Socket.
  3. Stellen Sie sicher, dass Ihre App einen Client für den Server hat.
  4. dann wird Ihre App eine Benachrichtigung erhalten.

Sie können meinen Code oder die PostgreSQL-Dokumentation sehen .

Es scheint, dass die Benachrichtigung keine verlässliche Benachrichtigung ist, aber zumindest funktioniert sie für mich.

user275831
quelle
Netter Ansatz. Dies ist im Grunde ein benutzerdefinierter Trigger?
Kiril