はじめに
担当しているWebサービスがなぜ遅いのか特定するために、時間のかかるクエリを確認する必要がありました。
今日は、その時に知ったAurora (Amazon RDS for PostgreSQL)で、スロークエリを発行する方法について書きます。
PostgreSQLはMySQLと違って、設定が少しだけ面倒なんです...
最初に結論
パラメータグループに以下を設定します。
log_statement mod
log_min_duration_statement 1000
前提
RDSへの接続がされていることを前提としています。
パラメータグループの作成
2.タイプ「DB Cluster Parameter Group」を選択
DB Parameter Group ・・・ 特定のインスタンスにのみ適用できる
DB Cluster Parameter Group ・・・ クラスター全体に適用できる
3.作成したパラメータグループを編集
以下の設定で、実行に1000ms以上かかったクエリがログに出力されます。
log_statement mod
log_min_duration_statement 1000
適応タイプdynamic
は、パラメータの変更をデータベースの再起動なしに変更することができます。
log_statement・・・
ddlは、CREATE、ALTER、およびDROP文といった、データ定義文を全てログに記録します。
modは、全てのddl文に加え、INSERT、UPDATE、DELETE、TRUNCATE、およびCOPY FROMといった、データ変更文をログに記録します。
https://www.postgresql.jp/document/12/html/runtime-config-logging.html
log_min_duration_statement・・・
文の実行に少なくとも指定した時間かかった場合、それぞれの文の実行に要した時間をログに記録します。 この値が単位なしで指定された場合は、ミリ秒単位であるとみなします。
https://www.postgresql.jp/document/12/html/runtime-config-logging.html
4.DBクラスターのパラメータグループに作成したパラメータグループを設定
5.PostgreSQL ログにチェック
CloudWatchにスロークエリが出力されるようになります。
実行してみる
以下のログが出力されるようになりました🎊
あとはログはフィルターして、slackに通知したりアレンジしてみてください。
2022-01-10 04:31:25 UTC:10.0.0.96(50174):postgres@postgres:[21202]:LOG: duration: 2004.674 ms statement: select pg_sleep(2);
注意
- デフォルトのパラメータグループを使ってデータベースを起動していた場合、変更できないパラメータが存在します。その場合、カスタムパラメータへの変更が発生するため、データベースの再起動が必要です。なので、RDS起動時にカスタムパラメータを使用することをおすすめします。
参考