2010-12-11 2 views
6

Ich bin auf der Suche nach einer Lösung ähnlich der Inotify-Methode, Dateien für Änderungen zu beobachten. Ich bin mir bewusst, dass ich die binlog-Datei der MySQL-Datenbank beobachten und Abfragen ausführen kann, um die neuen Ergebnisse herauszusuchen, aber das scheint sehr ineffizient und unelegant zu sein; ebenso wie Massen von Abfragen in einer Schleife, die auf neue Ergebnisse warten.Gibt es eine Möglichkeit, eine MySQL-Datenbank für Änderungen mit Perl zu beobachten?

+7

http://stackoverflow.com/questions/3501346/how-do-i-hook-into-an-event-triggered-once-a-mysql-query-is-true – daxim

Antwort

6

Wenn Sie die Tabelle (n), an denen Sie interessiert sind, um eine TRIGGER ergänzen, können Sie damit die überwachte Anwendung benachrichtigen. Sie können dies auf verschiedene Arten tun:

  1. Erstellen Sie eine Audit-Tabelle in der Datenbank, und lassen Sie den Auslöser die relevanten Informationen dort schreiben; und lassen Sie Ihre Überwachungsanwendung die Audit-Tabelle nach neuen Einträgen abfragen. Sie pollen immer noch, aber in einer kontrollierten Weise, die den Server nicht zu hart trifft.
  2. Haben Sie den Auslöser call an external app durch eine UDF.
+3

Das ist was [ich bereits vor 6 Tagen kommentiert] (http://stackoverflow.com/q/4418598#comment-4820725) als bereits existierende Antwort. Genießen Sie Ihre Prämie. – daxim

+2

FWIW, ich habe diese Antwort hinzugefügt, bevor ich Ihren Kommentar bemerkt habe (was ich getan habe); und die erste meiner vorgeschlagenen Lösungen ist anders als deine. Ich habe wirklich nicht plagiiert. –

+1

@daxim: Wenn Sie das Kopfgeld wollten - sollten Sie Ihren Kommentar als Antwort geschrieben haben! ;-) – Brad

1

Soweit MyISAM Tabellen gehen können Sie information_schema.TABLES.UPDATE_TIME ansehen. Das würde Sie davon abhalten, alle Tabellen abzufragen, an denen Sie interessiert sind. Für InnoDB ist das Anschauen von binlog das Beste, was ich mir vorstellen kann.

+0

+1 für information_schema. TABLES.UPDATE_TIME – DVK

0

Ein anderer Ansatz ist ein Push/Signal anstelle einer DB-Abfrage. Haben Sie einen Prozess, der die Datenbank aktualisiert, benachrichtigen Sie Ihren Perl-Code, dass ein Update über einen von Ihnen ausgewählten IPC durchgeführt wurde (heck, eine angehängte Protokolldatei mit Namen der Tabelle, die geändert wird, könnte den Erfolg gut genug machen).

Dies ist besonders effektiv, wenn die Updates eine ziemlich seltene/geringe Lautstärke, aber die Reaktionszeit auf sie muss schnell sein.

Ein weiterer Vorteil ist die Portabilität - funktioniert für jedes MySQL-Backend oder für jede andere DB-Engine.

+0

Dies ist leider keine Option, da die Datenbank von einem anderen von mir verwendeten Drittanbieterprogramm aktualisiert wird und das Perl-Skript, das ich schreibe, die Datenbank nicht aktualisiert. – Drake

Verwandte Themen