何回も忘れては、調べてを繰り返しているので備忘録として残す。
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とかに吐き出すようにしたほうが良さそう。
気が向いたら、ココらへんも書きます。
以上