AWS RDSのMySQLのスロークエリログを簡単に取得する方法

処理に時間のかかるクエリを把握することはとても重要です。 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のスロークエリログを把握できるようになったので、問題のあるクエリを簡単に見つけられるようになりました🚀

@takp