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);
};