Bir veritabanı değişikliği (ekleme, güncelleme, silme) gerçekleştiğinde gerçek zamanlı bildirimler nasıl alınır?


13

Ben bir veritabanı tablosu izlemek gerekir bir gösterge tablosu oluşturuyorum. Yalnızca veritabanı erişimim var (uygulama katmanı yok). Tablo oldukça büyük (10 milyon satır), ancak hızla değişmiyor (dakikada 100 ekleme / güncelleme)

Tablonun değişip değişmediğini nasıl öğrenebilirim? Veritabanına her saniye vurmaya çalışıyordum, ama bu kaba kuvvet yaklaşımı gibi görünüyor ...

Veritabanları: MySQL / Postgres


Bu yardımcı olabilir . Bunu sunucu grubumuzu izlemek için kullanıyoruz. Bu DB tablo değişikliği izlemek için özelliği olacak eminim. Maalesef tablo düzeyine kadar yapılandırmadık. Yani, tablo seviyesine kadar yapılandırmanın farkında değilim.
Jude Niroshan

Yorum için teşekkürler. Ama nagios nasıl yardımcı olabilir? Yalnızca veritabanı erişimim var. Uzak makinelere hiçbir şey yükleyemiyorum.
Kiril

3
Bir satır her eklendiğinde veya güncellendiğinde gerçekten gerçek zamanlı olarak bilgilendirilmek ister misiniz? Tekrar düşün.
Tulains Córdova

Uygulama katmanınızın olmamasının geçerli bir nedeni var mı? Bana bir şeyler yapmanın en iyi yolu gibi geliyor, yani izlemeyi işleyen bir uygulama katmanına sahip olmak. Veritabanı sunucusundan e-posta göndermek temiz bir mimari gibi görünmüyor.
juhist

Bunu yapan küçük bir mysql eklentim var: github.com/Cyclonecode/mysql-notification
Cyclonecode 2:19

Yanıtlar:


9

Tetikleyicileri kullanabilirsiniz.

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

Bunun her saniye veritabanına isabet etmekten daha iyi olacağından emin değilim ya da postadaki tüm değişikliği gönderir ve pano yazılımının e-postayı ayrıştırmasına izin verir misiniz?
Kiril

1
'Eklenen', 'güncellenmiş' ve 'silinmiş' tablolardan seçim yaparak belirli değiştirilen değerleri alabilirsiniz ve kimlikleri gövdeye ekleyebilirsiniz.
stechray

2
E-posta göndermek yerine, kontrol panelinin desteklediği bir web API'sına bağlanan saklı bir prosedürü de çağırabilirsiniz. Ayrıntılar için buraya bakın: forums.asp.net/t/…
stechray

3
Veya tetikleyicilerin istediğiniz bir aralıkta sorgulayıp (ve boş) ek bir tabloya veri koymasını sağlayın. Teknik olarak 'gerçek zamanlı' değil, görünüşe göre yapılabilir.
Jan Doggen

1
Tetiğin güncelleme bilgilerini bir mesajlaşma aracısındaki bir kuyruğa (veya konuya) aktarmasını sağlayın. Bu her zaman benim en sevdiğim yaklaşım oldu. Bu şekilde, tetikleyicide herhangi bir karmaşık mantığınız olmaz ve iletiyi aldığınızda ne yaptığınız konusunda çok fazla esnekliğe sahip olursunuz. Ve bir pub / alt konuya yönelirseniz, birden fazla tüketicinin onu almasını ve onunla farklı şeyler yapmasını bile sağlayabilirsiniz.
mindcrime

3

PostgreSQL için bir satır değiştiğinde veritabanından bildirim almanın bir yolunu biliyorum.

  1. ekleme / güncelleme / silme olduğunda tetikleyiciyi kullanın.
  2. olay meydana geldiğinde bir istemci soketine bir bildirim gönderin.
  3. Uygulamanın sunucuya bir istemciniz olduğundan emin olun.
  4. uygulamanız bir bildirim alır.

Görebilirsiniz kodumu veya PostgreSQL'in belgelerine .

Bildirim güvenilir bir bildirim değil gibi görünüyor, ama en azından benim için çalışıyor.


Güzel yaklaşım. Bu temelde özel bir tetikleyici mi?
Kiril
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.