[AWS] RDSでslow queryを出力する

AWSのRDS、デフォルトはslow query log(スロークエリーログ)の出力オフなのですが、パラメータの変更によりテーブルに出力することができます。

DB負荷や、アプリ側のボトルネック調査に役立つので設定をしておきたいと思います。

 

今回は

  • slow query logをテーブルに出力する
  • 1秒以上かかっているクエリーが対象
  • 10,000行以上読み込んだクエリーが対象

の設定をおこないます。

RDSのmy.cnfをいじることはできないため、「RDS Command Line Toolkit」を利用して設定を変更していきます。

Linuxサーバで作業します。

コマンドラインツール利用の準備

コマンドラインツールを初めて使う場合はもろもろ設定です。

  • Javaは/usr/bin下に配置
  • ツール群を/usr/local/rds-tools下に配置
  • アクセスキーペアの設定のファイルを/usr/local/rds-tools/.credentialに配置
  • リージョンは日本(ap-northeast-1)

 

アクセスキーペアの設定ファイルの中身は以下です。

AWSAccessKeyId=<アクセスキー>
AWSSecretKey=<シークレットキー>

 

以下のように環境変数をセットします。

export JAVA_HOME=/usr
export AWS_RDS_HOME=/usr/local/rds-tools
export PATH=${PATH}:${JAVA_HOME}/bin:${AWS_RDS_HOME}/bin
export AWS_CREDENTIAL_FILE=/usr/local/rds-tools/.credential
export EC2_REGION=ap-northeast-1

新しいグループをつくる

パラメータ設定用に新しいグループをつくります。

  • グループ名は「modify-params-group」
  • MySQLのバージョンは「5.5」

 

以下を実行します。

rds-create-db-parameter-group modify-params-group  -d "parameter group for modify-params-group" -f MySQL5.5

グループを作成したら、設定を変更します。

rds-modify-db-parameter-group modify-params-group \
--parameters="name=slow_query_log, value=ON, method=immediate" \
--parameters="name=long_query_time, value=1, method=immediate" \
--parameters="name=min_examined_row_limit, value=10000, method=immediate"

 

インスタンスに新グループを適用する

最後に、対象としたいインスタンスのグループを今回つくったグループに変更します。

  • インスタンス名は「mydb」

 

以下を実行します。
rds-modify-db-instance mydb --db-parameter-group-name=modify-params-group

 

最後にインスタンスを再起動・・・と思ったのですが、
再起動なしでも反映されていました。

 

確認する

以下を実行します。
rds-describe-db-instances
 DBINSTANCE  daws01  2012-05-10T01:23:30.180Z  db.m1.small  mysql  5  root  available  daws01.clkgkdk5umud.ap-northeast-1.rds.amazonaws.com  13001  ap-northeast-1a  30  n  5.5.20  general-public-license
       SECGROUP  default:vpc-4bac1822  active
       PARAMGRP  modify-params-group  pending-reboot
       SUBNETGROUP  modify-params-group  Complete
       OPTIONGROUP  default:mysql-5-5  in-sync

 

MySQL上からも設定を確認します。

mysql > show global variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | ON    |
+----------------+-------+
1 row in set (0.00 sec)

mysql> show global variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

mysql> show global variables like 'min_examined_row_limit';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| min_examined_row_limit | 10000 |
+------------------------+-------+
1 row in set (0.00 sec)

 

問題なく設定されていれば完了です。

今後slow queryが発生したら、mysql.slow_logテーブルにレコードが登録されます。

 

なお、設定パラメータの確認は、RDSのウェブコンソールの「DB Parameter Groups」メニューからも確認できます(パラメータの検索も可能)。

RDSのコマンドラインツールは初めて使ったのですが、今回のようなグループ追加、設定変更だけでなく、インスタンスの作成や削除などもできるので、使いこなすとかなり幅が広がりそうです。

いずれはウェブコンソールからもさくっとできるようになるのかなと思います(実はもうできるとかあったら、教えて欲しいです)。

 

今回は以下のブログを参考にさせてもらいました。

http://blog.hori-uchi.com/2009/11/amazonrdsslow-query.html

※パラメータなど一部古い情報の部分は変更しています。