MySQLのスロークエリログを別サーバに転送する
- 複数台あるMySQLのスロークエリログを、いちいちDBサーバにログインして読むのがめんどうくさい
- log_output = FILE,TABLE としてテーブルに入れてリモートからSELECTできるようにするのは?
- → テーブルに入れた場合、query timeとlock timeの型がTIME型になり精度が秒になってしまうのでダメ
- ファイルに出力したものをログサーバーにどうにかして飛ばす
- 10分おきとかにscpする
- →これでできるのはわかるけど、他にいい方法ないかなぁ
- syslogで飛ばすのはどうか (id:stanaka++)
- →srd!!
- 10分おきとかにscpする
- log_output = FILE,TABLE としてテーブルに入れてリモートからSELECTできるようにするのは?
スロークエリログに限らず、追記されるファイル全般に適用できると思います。
rsyslogの方がいけてるそうですが、自分が使ってるのは syslog-ng 2.0.9 なのでそ
の設定例です。
DBサーバ
# follow_freq(180) で 3 分毎に追記分を転送するようにする。 # これ指定しないと poll になるはずなんだけど、なんでか追記分を読んでくれなかったので。 # ログサーバで filter するのに必要なので、log_prefix を忘れないこと。 source s_my_slowlog { file("/db/log/slow.log" log_prefix("my_slowlog: ") flags(no-parse) follow_freq(180) ); }; destination dn_logserver { udp("log"); }; log { source(s_my_slowlog); destination(dn_logserver); };
ログサーバー
source s_remote { udp(); tcp(); }; template t_raw { template("$MSGONLY\n"); template_escape(no); }; destination df_my_slowlog { file("/var/log/archive/my_slowlog/$HOST/$YEAR-$MONTH" template(t_raw) ); }; filter f_my_slowlog { program("my_slowlog"); }; log { source(s_remote); filter(f_my_slowlog); destination(df_my_slowlog); };