MySQLのスロークエリログを別サーバに転送する

  • 複数台あるMySQLのスロークエリログを、いちいちDBサーバにログインして読むのがめんどうくさい
    • log_output = FILE,TABLE としてテーブルに入れてリモートからSELECTできるようにするのは?
      • → テーブルに入れた場合、query timeとlock timeの型がTIME型になり精度が秒になってしまうのでダメ
    • ファイルに出力したものをログサーバーにどうにかして飛ばす
      • 10分おきとかにscpする
        • →これでできるのはわかるけど、他にいい方法ないかなぁ
      • syslogで飛ばすのはどうか (id:stanaka++)
        • →srd!!

スロークエリログに限らず、追記されるファイル全般に適用できると思います。

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