2010-12-11 11 views
6

私は、ファイルの変更を監視するinotifyメソッドに似たソリューションを探しています。私はmysqlデータベースのbinlogファイルを見ることができ、新しい結果を選ぶためにクエリを実行することができることを認識していますが、それは非常に非効率的であり、新しい結果を待っているループで単に大量のクエリを実行するだけです。perlを使ってmysqlデータベースの変更を監視する方法はありますか?

+7

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

答えて

6

興味のあるテーブルにTRIGGERを追加すると、それを使って監視アプリケーションに警告することができます。

  1. データベースに監査テーブルを作成し、そこに関連情報を書き込むようにしてください。監視アプリケーションで新しいエントリを監査テーブルにポーリングするようにしてください。あなたはまだポーリングしていますが、サーバをあまりにも激しく叩くことのない制御された方法で。
  2. UDFでトリガーcall an external appを持ってください。 INFORMATION_SCHEMAのため
+3

これは既に存在する答えとして[私はすでに6日前にコメントしました](http://stackoverflow.com/q/4418598#comment-4820725)です。あなたの恩恵をお楽しみください。 – daxim

+2

FWIW、私はあなたのコメントに気づいた前に、この回答を追加しました(これは私がアップしたものです)。私の提案されたソリューションの最初のものはあなたとは異なります。私は真に盗作をしていませんでした。 –

+1

@ダクシム:あなたが賞金を欲しがっていれば - 答えとしてあなたのコメントを投稿したはずです! ;-) – Brad

1

MyISAMテーブルに行く限り、information_schema.TABLES.UPDATE_TIMEを見ることができます。そうすれば、興味のあるすべてのテーブルをポーリングする必要がなくなります。InnoDBの場合は、binlogを見ることが私が考えることができる最高のものです。

+0

+1。 TABLES.UPDATE_TIME – DVK

0

もう1つの方法は、DBポーリングの代わりにプッシュ/シグナルを行うことです。どんなプロセスでもデータベースを更新して、あなたが選んだIPC経由で更新が行われたことをあなたのPerlコードに通知してください(変更されたテーブルの名前が付いたログファイルがうまくいくかもしれません)。

これは、非常にまれである/少ないボリュームを更新しても、反応時間が速くなければならない場合に特に効果的です。

さらに移植性が向上します。これは、任意のMySQLバックエンドまたは他のDBエンジンで有効です。

+0

私が使っている他のサードパーティ製のプログラムによってデータベースが更新され、私が書いているperlスクリプトがデータベースの更新をしないので、これは残念なことにオプションではありません。 – Drake

関連する問題