Jak otrzymywać powiadomienia w czasie rzeczywistym, gdy nastąpi zmiana bazy danych (wstawianie, aktualizowanie, usuwanie)?

13

Tworzę pulpit nawigacyjny, który powinien monitorować tabelę bazy danych. Mam tylko dostęp do bazy danych (bez warstwy aplikacji). Tabela jest dość duża (10 milionów wierszy), ale nie zmienia się szybko (100 wstawek / aktualizacji na minutę)

Jak mogę sprawdzić, czy zmienił się stół? Spróbowałbym trafić do bazy co sekundę, ale wydaje się, że jest to podejście brutalne ...

Bazy danych: MySQL / Postgres

Kiril
źródło
To może być pomocne . Używamy tego do monitorowania naszej farmy serwerów. Jestem prawie pewien, że będzie to miało funkcję śledzenia zmiany tabeli w DB. Niestety nie skonfigurowaliśmy do poziomu tabeli. Nie jestem więc świadomy konfiguracji do poziomu tabeli.
Jude Niroshan
Dziękuję za komentarz. Ale w jaki sposób nagios mogą pomóc? Mam tylko dostęp do bazy danych. Nie mogę zainstalować niczego na zdalnych komputerach.
Kiril
3
Czy naprawdę chcesz otrzymywać powiadomienia - w czasie rzeczywistym - za każdym razem, gdy wiersz jest wstawiany lub aktualizowany? Pomyśl jeszcze raz.
Tulains Córdova,
Czy istnieje jakiś ważny powód, dla którego nie masz warstwy aplikacji? Wydaje mi się, że najlepszym sposobem jest robienie różnych rzeczy, tj. Posiadanie warstwy aplikacji obsługującej monitorowanie. Na przykład wysyłanie wiadomości e-mail z serwera bazy danych nie wygląda na czystą architekturę.
juhist
Mam małą wtyczkę MySQL, która robi to: github.com/Cyclonecode/mysql-notification
Cyclonecode

Odpowiedzi:

9

Możesz użyć wyzwalaczy.

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
źródło
Nie jestem pewien, czy byłoby to lepsze niż trafianie do bazy danych co sekundę, czy też wysłałbyś całą zmianę w poczcie i pozwoliłeś oprogramowaniu deski rozdzielczej przeanalizować wiadomość e-mail?
Kiril,
1
Możesz uzyskać określone zmienione wartości, wybierając z tabel „wstawione”, „zaktualizowane” i „usunięte”, a także możesz dodać identyfikatory do treści.
stechray
2
Zamiast wysyłać wiadomości e-mail, możesz także wywołać procedurę składowaną, która łączy się z interfejsem WWW obsługiwanym przez pulpit nawigacyjny. Zobacz szczegóły: forums.asp.net/t/…
stechray
3
Lub wyzwalacze umieszczają dane w dodatkowej tabeli, którą następnie przeszukujesz (i opróżniasz) w pożądanych odstępach czasu. Technicznie nie „w czasie rzeczywistym”, ale można tak wyglądać.
Jan Doggen,
1
Poproś, aby wyzwalacz przesunął informacje o aktualizacji do kolejki (lub tematu) w brokerze przesyłania komunikatów. To zawsze było moje ulubione podejście. W ten sposób nie masz złożonej logiki w wyzwalaczu i masz dużą elastyczność w tym, co robisz z wiadomością po jej otrzymaniu. A jeśli przejdziesz do tematu publikacji / pubu, możesz nawet mieć wielu klientów, którzy go przyjmą i robią z nim różne rzeczy.
Mindcrime
3

W przypadku PostgreSQL znam sposób otrzymywania powiadomień z bazy danych, gdy zmienia się wiersz.

  1. użyj wyzwalacza, gdy nastąpi wstawienie / aktualizacja / usunięcie.
  2. gdy wystąpi zdarzenie, wyślij powiadomienie do gniazda klienta.
  3. upewnij się, że Twoja aplikacja ma klienta na serwerze.
  4. wtedy Twoja aplikacja otrzyma powiadomienie.

Możesz zobaczyć mój kod lub dokumentację PostgreSQL .

Wygląda na to, że powiadomienie nie jest wiarygodnym powiadomieniem, ale przynajmniej działa dla mnie.

użytkownik275831
źródło
Niezłe podejście. To jest w zasadzie niestandardowy wyzwalacz?
Kiril,