処理に時間のかかるクエリを把握することはとても重要です。 MySQLはスロークエリログを出力できるので、それを用いて最適化していけます。
今回、AWSのRDSで運用しているMySQLのスロークエリログの取得方法についてまとめたいと思います。
MySQLスロークエリログの有効化させる設定
はじめに、AWSのRDSのダッシュボードページに行き、パラメータグループの設定に進みます。
まず、slow_query_log
を 1に設定します。
次に、long_query_time
で設定した値よりも遅いクエリをスロークエリとしてログに記録します。
デフォルトでは10秒ですが、もう少し短い方が良いのではないでしょうか。僕は通常は1秒に設定しています。
上記の設定が終わったら、RDSに適用させましょう。同期中となっていれば同期が進んでいますが、再起動が必要な場合は再起動させないといけません。
スロークエリログの取得
AWSのRDSはスロークエリログをTABLEに保存しています。AWSのCLI(コマンドラインツール)を使って、このスロークエリログを取得するのをオススメします。
下記のコードで取得できます。ただし、YOUR_DB_IDENTIFIERをあなたの実際のDB identifierに変更してください。
$for i in {0..23}
do aws rds download-db-log-file-portion \
--db-instance-identifier YOUR_DB_IDENTIFIER \
--log-file-name slowquery/mysql-slowquery.log.$i \
--output text \
> slowquery.log
done
AWS CLIについてもっと詳しく知りたい場合は、公式ドキュメントを参照ください。
もし複数のAWSアカウントを所有している場合は、--profile YOUR_PROFILE_NAME
という一文をawsコマンドに追加すれば、そのプロフィールのAWSアカウントの操作が可能です。
取得したスロークエリのサマライズ
mysqldumpslowコマンドを用いて、スロークエリログを見やすく集計する事が出来ます。
$ mysqldumpslow -s t slowquery.log > report.log
集計すると次のようになります。
Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=0.0 (0), 0users@0hosts
これらの処理を1つにまとめて実行する
上記の処理を一つのファイルにまとめてしまうと便利です。シェルスクリプトのファイルを作りましょう。
slow_query.sh
#!/bin/sh
for i in {0..23}
do aws rds download-db-log-file-portion \
--db-instance-identifier YOUR_DB_IDENTIFIER \
--log-file-name slowquery/mysql-slowquery.log.$i \
--output text \
> slowquery.log
done
mysqldumpslow -s t slowquery.log > report.log
$ sh slow_query.sh
これで簡単にRDSのスロークエリログを把握できるようになったので、問題のあるクエリを簡単に見つけられるようになりました🚀