2010-12-11 13 views
6

Sto cercando una soluzione simile al metodo inotify di guardare i file per le modifiche. Sono consapevole che potrei guardare il file binlog del database mysql ed eseguire query per individuare i nuovi risultati, ma ciò sembra molto inefficiente e poco elegante; come fa semplicemente facendo masse di query in un ciclo in attesa di nuovi risultati.C'è un modo per guardare un database mysql per le modifiche usando perl?

+7

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

risposta

6

Se si aggiunge un TRIGGER alla/e tabella/i a cui si è interessati, è possibile utilizzarlo per avvisare l'applicazione di sorveglianza. È possibile farlo in diversi modi:

  1. Creare una tabella di controllo nel database e fare in modo che il trigger scriva le informazioni rilevanti lì; e fare in modo che l'applicazione di sorveglianza esegua il polling della tabella di controllo per le nuove voci. Stai ancora sondando, ma in modo controllato che non colpirà troppo il server.
  2. Avere il trigger call an external app attraverso un UDF.
+3

Ecco cosa [ho commentato già 6 giorni fa] (http://stackoverflow.com/q/4418598#comment-4820725) come risposta già esistente. Goditi la tua generosità. – daxim

+2

FWIW, ho aggiunto questa risposta prima di aver notato il tuo commento (che ho fatto upvote); e la prima delle mie soluzioni suggerite è diversa dalla tua. Io sinceramente non stavo plagiando. –

+1

@daxim: Se volessi la taglia - avresti dovuto pubblicare il tuo commento come risposta! ;-) – Brad

1

Per quanto riguarda i tavoli MyISAM, è possibile guardare information_schema.TABLES.UPDATE_TIME. Questo ti farebbe risparmiare il polling di tutte le tabelle che ti interessano. Per InnoDB, guardare binlog è il meglio che riesco a pensare.

+0

+1 per information_schema. TABLES.UPDATE_TIME – DVK

0

Un altro approccio è eseguire un push/segnale anziché un polling DB. Qualunque processo aggiorni il database, notifica al tuo codice Perl che è stato fatto un aggiornamento tramite qualsiasi IPC selezionato (diamine, un file di registro che viene aggiunto con il nome della tabella che viene modificato potrebbe fare abbastanza bene il trucco).

Questo è particolarmente efficace se gli aggiornamenti di un volume abbastanza raro/basso, ma il tempo di reazione a loro deve essere veloce.

Un ulteriore vantaggio è la portabilità: funziona per qualsiasi backend MySQL o per qualsiasi altro motore DB.

+0

Questa non è purtroppo un'opzione in quanto il database viene aggiornato da qualche altro programma di terze parti che sto utilizzando e lo script perl che sto scrivendo non esegue l'aggiornamento del database. – Drake

Problemi correlati