RDS

RDSの slow query について

More than 1 year has passed since last update.

何回も忘れては、調べてを繰り返しているので備忘録として残す。

aws rds を使用している際、 default では slow query が出力されないので、別途 parameter group を設定する必要がある。
※ parameter group には、 Apply Type というのがある。
dynamic 即時反映
static 値を変更した後に、DBを再起動しなければ反映されない。

下記の parameter を貪る必要あり。

  • slow_query_log = 1 (defaultだと 0 で無効になっている)
  • log_output = FILE (defaultだと TABLE になっている)
  • long_query_time = 任意の値 0 ~ 31536000

slow_query_log

これを 1 にするということは、 MySQLでは下記に当たる部分。
AWS RDS では、 parameter group で変更することが可能。

my.cnf

# slow queryを有効
slow_query_log = ON

log_output

これが一番面倒くさかった。
default が TABLE になっている為、 slow_query_log = 1 で設定すると、 slow_query は見えるが table に格納される。
下記 SQL で確認可能

SELECT * FROM mysql.slow_log;

が、下記ドキュメントに記載があるが、 24 時間ごとにログテーブルのローテーションが実行されます。 とある。

ログテーブルのローテーションが実行されると、現在のログテーブルがバックアップのログテーブルにコピーされ、現在のログテーブル内にあるエントリは削除されます。バックアップのログテーブルがすでに存在する場合は、現在のログテーブルをバックアップにコピーする前に、削除されます。バックアップのログテーブルは、必要に応じて照会することができます。mysql.general_log テーブルに対するバックアップのログテーブルは、mysql.general_log_backup という名前になります。mysql.slow_log テーブルに対するバックアップのログテーブルは、mysql.slow_log_backup という名前になります。

ので、直近48時間の slow query しか確認できない。
特に TABLE に拘りがなければ、 FILE にするべきだと感じた。

long_query_time

文字通り long_query_time = n
n秒以上かかった query を記録するのみ。

まとめ

この3つの parameter は、セットで設定しておくべきだと感じた。
どこに吐き出すかは、決めれるがいずれにせよ全部残るわけではないので、S3とかに吐き出すようにしたほうが良さそう。
気が向いたら、ココらへんも書きます。
以上