Come ottenere notifiche in tempo reale quando si verifica una modifica del database (inserire, aggiornare, eliminare)?


13

Sto creando una dashboard che dovrebbe monitorare una tabella di database. Ho solo l'accesso al database (nessun livello di applicazione). La tabella è piuttosto grande (10 milioni di righe), tuttavia non cambia rapidamente (100 inserimenti / aggiornamenti al minuto)

Come posso sapere se la tabella è cambiata? Proverei a colpire il database ogni secondo, ma questo sembra un approccio a forza bruta ...

Database: MySQL / Postgres


Questo potrebbe essere utile . Lo stiamo usando per monitorare la nostra server farm. Sono abbastanza sicuro che questo avrà la funzione di tracciare una modifica della tabella nel DB. Purtroppo non abbiamo configurato fino al livello di tabella. Quindi, non sono a conoscenza della configurazione fino al livello della tabella.
Jude Niroshan,

Grazie per il commento. Ma come possono aiutare i nagios? Ho solo l'accesso al database. Non riesco a installare nulla su macchine remote.
Kiril,

3
Vuoi davvero essere avvisato - in tempo reale - ogni volta che una riga viene inserita o aggiornata? Pensa di nuovo.
Tulains Córdova,

C'è qualche motivo valido per cui non hai un livello applicazione? Mi sembrerebbe il modo migliore per fare le cose, cioè avere un livello applicativo che gestisca il monitoraggio. Ad esempio, l'invio di e-mail dal server di database non sembra un'architettura pulita.
juhist,

Ho un piccolo plugin mysql che fa questo: github.com/Cyclonecode/mysql-notification
Cyclonecode

Risposte:


9

È possibile utilizzare i trigger.

CREATE TRIGGER notifyMe
ON table1
AFTER INSERT, UPDATE, DELETE 
AS
   EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'DB AutoMailer',
        @recipients = 'user@example.com',
        @body = 'The DB has changed',
        @subject = 'DB Change';
GO

Non sono sicuro che sarebbe meglio, che colpire il database ogni secondo, o invieresti l'intera modifica nella posta e lasceresti che il software del dashboard analizzi l'e-mail?
Kiril,

1
È possibile ottenere i valori modificati specifici selezionando dalle tabelle "inserite", "aggiornate" e "eliminate" e aggiungere gli ID al corpo.
stechray

2
Invece di inviare e-mail, è anche possibile chiamare una procedura memorizzata che si collega a un'API Web supportata dalla dashboard. Vedi qui per i dettagli: forums.asp.net/t/…
stechray

3
Oppure fai in modo che i trigger inseriscano i dati in una tabella aggiuntiva che richiedi (e svuoti) agli intervalli desiderati. Tecnicamente non "in tempo reale", ma può essere fatto sembrare simile.
Jan Doggen,

1
Chiedi al trigger di inviare le informazioni di aggiornamento su una coda (o argomento) su un broker di messaggistica. Questo è sempre stato il mio approccio preferito. In questo modo non hai alcuna logica complessa nel trigger e hai molta flessibilità con ciò che fai con il messaggio quando lo ricevi. E se passi a un pub / argomento secondario, puoi anche avere più consumatori che lo ricevono e fanno cose diverse con esso.
mindcrime

3

Per PostgreSQL conosco un modo per ricevere notifiche dal database quando cambia una riga.

  1. usa il trigger quando si inserisce / aggiorna / elimina.
  2. quando si verifica un evento, inviare una notifica a un socket client.
  3. assicurati di avere un client sul server dell'app.
  4. quindi la tua app riceverà una notifica.

Puoi vedere il mio codice o la documentazione di PostgreSQL .

Sembra che la notifica non sia affidabile, ma almeno funziona per me.


Bel approccio. Questo è fondamentalmente un trigger personalizzato?
Kiril,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.