Amazon Relational Database Service (Amazon RDS) for PostgreSQL の DB インスタンスでクエリログを有効にしたいと考えています。
簡単な説明
ログに記録するクエリに応じて、log_statement または log_min_duration_statement を有効にします。詳細については、PostgreSQL のウェブサイトで「log_min_duration_statement」および「log_statement」を参照してください。Amazon RDS for PostgreSQL でログ記録を有効にするために、両方のパラメータを変更する必要はありません。
完了までに特定の時間を要しているクエリのログを確認するには、log_min_duration_statement パラメータをミリ秒単位のしきい値で変更します。たとえば、パラメータ値を 500 に設定した場合、Amazon RDS は完了までに 0.5 秒より長い時間を要するすべてのクエリを記録します。パラメータ値を -1 に設定すると、パラメータは無効になります。この場合、Amazon RDS は、完了までの時間に基づいたクエリの記録を行いません。パラメータ値を 0 に設定すると、Amazon RDS はすべてのクエリを記録します。
log_statement パラメータで次の値を設定すると、記録する SQL ステートメントを制御できます。
- ddl: すべてのデータ定義言語 (DDL) ステートメント (例: CREATE、ALTER、DROP) を記録します。
- mod: すべての DDL および、データ変更言語 (DML) ステートメント (例: INSERT、UPDATE、DELETE) を記録します。
- all: 実行時間に関係なく、すべてのクエリを記録します。
注: log_statement パラメータのデフォルト値は none です。
Amazon RDS は、log_min_duration_statement または log_statement に設定した値に関係なく、クエリを 1 回ログに書き込みます。ただし、ログパラメータを変更すると、DB インスタンスのボリュームは追加の容量を必要とする場合があります。ストレージの使用量を最小化するには、パラメータには大規模なログ記録を引き起こす値 (例: log_statement に all、log_min_duration_statement に 0) を設定しないでください。
ボリュームストレージに空きがない場合、DB インスタンスを使用できなくなるため、rds.log_retention_period パラメータを変更し、不要なログを削除することをおすすめします。Amazon CloudWatch メトリクス FreeStorageSpace を参照し、ストレージ使用量を継続的に監視することも推奨されます。ストレージスペースの空きが枯渇してきた場合、ストレージ容量を増やし、DB インスタンスを常時使用できるようにすることも可能です。
解決策
カスタムパラメータグループを変更してログ記録を有効にする
次の手順を実行します。
- Amazon RDS コンソールを開きます。
- カスタムパラメータグループを作成し、DB インスタンスに関連付けます。
注: [すぐに適用] を選択した場合、DB インスタンスは一時的に使用できなくなります。
- ナビゲーションペインで [パラメータグループ] を選択します。
- カスタムパラメータグループを選択します。
- [パラメータの編集] を選択します。
- [パラメーターをフィルター] フィールドに log_statement または log_min_duration_statement を入力します。
- 表示されたパラメータを選択し、変更します (例: log_statement を ddl に変更、log_min_duration_statement を 1000 (1 秒) に変更)。
- [変更を保存] を選択します。
注: パラメータは動的であるため、パラメータの変更を反映するために DB インスタンスを再起動する必要はありません。
パラメータグループのステータスは Applying に変わります。パラメータグループの変更が完了すると、ステータスは In-Sync に変わります。
ログ記録が有効であることを確認する
次の手順を実行します。
- DB インスタンスに接続します。
- 次のコマンドを実行します。
CREATE TABLE article(article_code bigint, created_at timestamp with time zone, summary text, content text) ;
SELECT pg_sleep(2);
SELECT generate_series(1,10000000) as test;
注: 例内の値を実際の値に置き換えてください。
上記のコマンド例の出力には、所要時間が 1 秒よりも長いすべての DDL ステートメントとクエリが表示されます。
クエリログを確認する
次の手順を実行します。
- Amazon RDS コンソールを開きます。
- ナビゲーションペインで [データベース] を選択します。
- 該当する DB インスタンスを選択します。
- [ログとイベント] タブを選択します。
- [ログ] セクションで最新のログを選択し、[表示] を選択します。
ログの例:
2018-12-19 11:05:32 UTC:172.31.xx.yyy(35708):user@awspostgres:[27174]:LOG: statement: CREATE TABLE article(article_code bigint, created_at timestamp with time zone, summary text, content text) ;
2018-12-19 11:10:36 UTC:172.31.xx.yyy(35708):user@awspostgres:[27174]:LOG: duration: 2010.247 ms statement: select pg_sleep(2);
2018-12-19 11:11:25 UTC:172.31.xx.yyy(35708):user@awspostgres:[27174]:LOG: duration: 2159.838 ms statement: SELECT generate_series(1,10000000) as test;
関連情報
RDS for PostgreSQL データベースログファイル