'tail -f' eine Datenbanktabelle

8

Ist es möglich, eine Datenbanktabelle effektiv zu beenden, sodass eine Anwendung, wenn eine neue Zeile hinzugefügt wird, sofort mit der neuen Zeile benachrichtigt wird? Jede Datenbank kann verwendet werden.

    
avid 11.04.2011, 17:06
quelle

8 Antworten

7

Verwenden Sie einen ON INSERT-Trigger.

Sie müssen nach Einzelheiten darüber suchen, wie Sie externe Anwendungen mit den Werten aufrufen, die im eingefügten Datensatz enthalten sind, oder Sie schreiben Ihre 'Anwendung' als SQL-Prozedur und lassen sie in der Datenbank laufen.

Es klingt, als würden Sie Datenbanken im Allgemeinen auffrischen wollen, bevor Sie sich mit Ihren Befehlszeilenansätzen in eine Ecke malen.

    
Randy 11.04.2011, 17:14
quelle
5
  • Ja, wenn die Datenbank eine flache Textdatei ist und die Anhänge am Ende erstellt werden.
  • Ja, wenn die Datenbank diese Funktion auf andere Weise unterstützt; Überprüfen Sie das entsprechende Handbuch.
  • Ansonsten, nein. Datenbanken sind in der Regel binäre Dateien.
Fred Foo 11.04.2011 17:08
quelle
1

Ich bin nicht sicher, aber das könnte für primitive / flache Datei-Datenbanken funktionieren, aber soweit ich verstehe (und ich könnte falsch liegen), sind die modernen Datenbank-Dateien verschlüsselt. Daher würde das Lesen einer neu hinzugefügten Zeile mit diesem Befehl nicht funktionieren.

    
Sabeen Malik 11.04.2011 17:08
quelle
1

Ich könnte mir vorstellen, dass die meisten Datenbanken Schreibtrigger zulassen, und Sie könnten ein Skript haben, das beim Schreiben auslöst und Ihnen etwas von dem, was passiert ist, mitteilt. Ich weiß nicht, welche Informationen verfügbar wären, da dies von der einzelnen Datenbank abhängen würde.

    
corsiKa 11.04.2011 17:12
quelle
1

Hier gibt es ein paar Optionen, von denen einige andere bemerkt haben:

  • In regelmäßigen Abständen nach neuen Zeilen suchen. Mit der Art wie MVCC funktioniert, ist es jedoch möglich, eine Zeile zu verpassen, wenn während der letzten Abfrage zwei INSERT-Operationen in der Mitte der Transaktion stattgefunden haben .
  • Definieren Sie eine Triggerfunktion, die bei jedem Einfügen etwas Arbeit für Sie leistet. (In Postgres können Sie einen NOTIFY-Befehl aufrufen, zu dem andere Prozesse LISTEN können.) Sie könnten einen Trigger mit Schreibvorgängen in einer unpublished_row_ids-Tabelle kombinieren, um sicherzustellen, dass bei Ihrem Tailing-Prozess nichts verloren geht. (Der Tailing-Prozess würde dann IDs aus der Tabelle unpublished_row_ids löschen, während sie diese verarbeitet.)
  • Haken Sie sich in die Replikationsfunktion der Datenbank ein, falls diese verfügbar ist. Dies sollte sicherstellen, dass Zeilen nicht verpasst werden.

Ich habe ausführlich darüber gebloggt, wie man all diese Möglichkeiten mit Postgres in Ссылка macht.

    
btubbs 11.02.2015 04:53
quelle
0

tail unter Linux scheint inotify zu verwenden, um zu sagen, wenn sich eine Datei ändert - wahrscheinlich verwendet sie ähnliche Dateisystembenachrichtigungs-Frameworks auf anderen Betriebssystemen. Daher erkennt es Dateiänderungen.

Das heißt, tail führt nach jeder gefundenen Änderung einen fstat() Aufruf durch und gibt nichts aus, wenn die Datei nicht größer wird. Moderne DB-Systeme verwenden zufälligen Dateizugriff und verwenden DB-Seiten erneut, so dass es sehr wahrscheinlich ist, dass eine eingefügte Zeile nicht dazu führt, dass sich die Größe der Backing-Datei ändert.

Sie verwenden inotify (oder Ähnliches) besser direkt und sogar noch besser, wenn Sie DB-Trigger oder einen anderen Mechanismus verwenden, den Ihr DBMS DB-Updates bietet, da nicht alle Dateiupdates notwendigerweise Zeileneinfügevorgänge sind / p>     

thkala 11.04.2011 17:14
quelle
0

Ich war gerade mitten in der Veröffentlichung der gleichen genauen Antwort wie Glowcoder, plus eine andere Idee:

Die Low-Tech-Methode besteht darin, ein Timestamp-Feld zu verwenden und ein Programm jede Abfrage nach n Minuten auszuführen, um nach Datensätzen zu suchen, deren Timestamp größer ist als der letzte Durchlauf. Das gleiche Konzept kann durch Speichern des letzten Schlüssels, der gesehen wird, wenn Sie eine Sequenz verwenden, oder sogar durch Hinzufügen eines booleschen Feldes "verarbeite" erreicht werden.

    
dj_segfault 11.04.2011 17:15
quelle
0

Mit Oracle können Sie eine Pseudo-Spalte namens "rowid" auswählen, die eine eindeutige Kennung für die Zeile in der Tabelle angibt, und rowid's sind ordinal ... neuen Zeilen werden roweids zugewiesen, die größer sind als alle vorhandenen rowids.

Wählen Sie also zuerst max (rowid) aus table_name

Ich nehme an, dass eine Ursache für die aufgeworfene Frage darin besteht, dass es viele, viele Zeilen in der Tabelle gibt ... also wird dieser erste Schritt die DB ein wenig besteuern und etwas dauern.

Wählen Sie dann * aus table_name wo rowid & gt; "was auch immer_dieses_Routing_was_was"

Sie müssen die Abfrage immer noch regelmäßig ausführen, aber es ist jetzt nur eine schnelle und kostengünstige Abfrage

    
Rondo 13.04.2011 02:07
quelle

Tags und Links