- EDB
- PostgreSQL
新ツール Postgres Workload Report によるパフォーマンス診断~データベース管理の未来を共に創る!~
EDB Postgres Workload Reportsは、Postgresデータベースのパフォーマンス診断とトラブルシューティングを強化する新しいツールです。OracleのAWRに似た詳細なレポートを提供し、データベースの問題を迅速に特定・解決できるようサポートします。本記事では概要と利用手順をご紹介します。
|
今回はPostgreSQLにおいて、障害発生に備えて設定すべき3つのログ関連パラメーターを紹介します。これらのパラメーターを設定しておくことで、障害発生時にその状況を詳細に把握することができます。障害の原因および対策を見つけられる可能性が高くなりますので、ぜひ忘れずに設定しておきましょう。
PostgreSQLのログ出力には、Linuxの場合はsyslog、Windowsの場合はeventlogのログ機能などを選択できますが、今回はPostgreSQL独自のログ機能を使用することを前提として解説します。
障害発生に備えて、アシストサポートセンターが推奨するログ関連パラメーターの設定は以下の3つです。
上記3つのパラメーターをpostgresql.confに設定することで、ログファイルには次のように出力されます。
[2015-08-30 20:40:26 JST]testuser postgres 3414[1]ERROR: relation "test" does not exist
[2015-08-30 20:40:26 JST]testuser postgres 3414[2]STATEMENT: create index test_ind on test(no);
[2015-08-30 21:28:20 JST] 2727[6]LOG: parameter "log_min_duration_statement" changed to "10000"
[2015-08-30 21:29:26 JST]testuser postgres 17060[1]LOG: duration: 63122.171 ms statement: select * from pgbench_accounts where aid>5000;
上記3つのパラメーターを設定しておくことで、調査に必要な情報(タイムスタンプ、接続先ユーザー名、接続先データベース名、プロセスIDなど)がログファイルに記録され、障害発生時の状況を調査しやすくなります。
以降では、各パラメーターの概要、設定方法、ログファイルの出力例についてご紹介していきます。
logging_collectorでは、標準エラー(stderr)またはCSV書式のログ出力に送られるメッセージを取り出し、ログファイルにリダイレクトするか否かをon/offで設定します。PostgreSQLをソースファイルからインストールした場合、デフォルト値はoffに設定されています。つまり、ログファイルは生成されません。
一方、EnterpriseDB社が提供するインストールモジュールやRPMパッケージからインストールした場合には、デフォルト値がonに設定されているため、ログファイルは生成されます。ただし、このパラメーターをonに設定しただけでは、ログファイルから確認できる情報はメッセージのみとなり、エラーが発生した日時、ユーザ名、データベース名がわかりませんので、他の2つのパラメーターも合わせて設定する必要があります。
1) PostgreSQLをインストールしたOSユーザーまたはAdministratorユーザーでログイン
2)
postgresql.confの編集
PGDATA/postgresql.confを開き、logging_collectorの値がoffの場合はonに変更します。
3) PostgreSQLサービスの再起動
[スタート]→[コントロールパネル]→[管理ツール]→[サービス]からサービス一覧を表示し、PostgreSQLのサービスを再起動します。
※PGDATAは、データベース格納領域であるデータベースクラスタのパスを設定する環境変数です。
1) PostgreSQLをインストールしたOSユーザーに接続
# su - <PostgreSQLをインストールしたOSユーザー名>
2) postgresql.confの編集
PGDATA/postgresql.confを開き、logging_collectorの値がoffの場合はonに変更します。
3) PostgreSQLの再起動
$ pg_ctl restart
デフォルト設定では、PGDATA/pg_log配下にpostgresql-%Y-%m-%d_%H%M%S.logの書式でログファイルが生成されます。以下の例では、logging_collector=onを設定した状態でtest_ind索引を作成しようとして失敗した際にログファイルに記録された内容を表示しています。ログファイルからERRORメッセージが発生していることは確認できますが、いつどのデータベースで発生したERRORメッセージであるかを確認することはできません。
LOG: database system was shut down at 2015-08-30 20:23:22 JST
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
ERROR: relation "test" does not exist
STATEMENT: create index test_ind on test(no);
log_line_prefixでは、各ログ行の先頭に付与するプレフィックスを設定します。デフォルト設定では何も設定されていません。
%から始まるエスケープシーケンス
を設定することで、各ステータス情報に置き換えられます。例えば、%tはタイムスタンプ、%uはデータベースのユーザー名、%dはデータベース名、%pはOSのPID、%lは各セッション/プロセス毎のログ行番号に置き換えられます。
1) PostgreSQLをインストールしたOSユーザーまたはAdministratorユーザーでログイン
2) postgresql.confの編集
PGDATA/postgresql.confを開き、log_line_prefixの値を'[%t]%u %d %p[%l]'に設定します。
3) PostgreSQLのリロード
DOS> pg_ctl reload
1) PostgreSQLをインストールしたOSユーザーに接続
# su - <PostgreSQLをインストールしたOSユーザー名>
2) postgresql.confの編集
PGDATA/postgresql.confを開き、log_line_prefixの値を'[%t]%u %d %p[%l]'に設定します。
3) PostgreSQLのリロード
$ pg_ctl reload
以下の例は、log_line_prefix='[%t]%u %d %p[%l]'を設定した状態でtest_ind索引を作成しようとして失敗した際にログファイルに記録された内容を表示しています。logging_collector=onだけを設定していた時とは異なり、いつどこでERRORメッセージが発生しているかを確認できるようになっています。これらの情報から、今回のERRORメッセージはtestuserユーザーでpostgresデータベース内に存在しないtest表に対して索引を作成しようとしたために発生したことがわかります。
LOG: received SIGHUP, reloading configuration files
[2015-08-30 20:36:22 JST] 2727[5]LOG: parameter "log_line_prefix" changed to "[%t]%u %d %p[%l]"
[2015-08-30 20:40:26 JST]testuser postgres 3414[1]ERROR: relation "test" does not exist
[2015-08-30 20:40:26 JST]testuser postgres 3414[2]STATEMENT: create index test_ind on test(no);
<上記ログ出力から確認できる当該ERRORメッセージに関する情報>
----------------------------------------------------------------------------------------------------
発生時刻:2015-08-30 20:40:26
処理を実行したユーザー名:testuser
接続先データベース名:postgres
OSのPID:3414
PID 3414に関連するメッセージ1:ERROR: relation "test" does not exist
PID 3414に関連するメッセージ2:STATEMENT: create index test_ind on test(no);
----------------------------------------------------------------------------------------------------
log_min_duration_statementでは、SQLの実行に指定したミリ秒以上の時間がかかった場合に、そのSQLと所要時間をログファイルに記録します。デフォルト値は、-1(SQLおよびその所要時間の記録をしない)に設定されています。このパラメーターに許容できないレスポンス時間を設定することで、ログファイルからスロークエリを把握することができます。
1) PostgreSQLをインストールしたOSユーザーまたはAdministratorユーザーでログイン
2) postgresql.confの編集
PGDATA/postgresql.confを開き、log_min_duration_statementの値に許容できないレスポンス時間(ミリ秒)を設定します。
3) PostgreSQLのリロード
DOS> pg_ctl reload
1) PostgreSQLをインストールしたOSユーザーに接続
# su - <PostgreSQLをインストールしたOSユーザー名>
2) postgresql.confの編集
PGDATA/postgresql.confを開き、log_min_duration_statementの値に許容できないレスポンス時間(ミリ秒)を設定します。
3) PostgreSQLのリロード
$ pg_ctl reload
以下の例は、log_min_duration_statement=10000を設定した状態で10秒以上かかるSQLを実行した際にログファイルに記録された内容を表示しています。 ログファイルからスロークエリを確認できたら、スロークエリで参照するテーブルの統計情報が最新であるかやEXPLAIN ANALYZE <スロークエリ>コマンドを使用して適切な実行計画で処理が行われているかなど、ボトルネックがどこにあるかを確認することで改善策を検討できます。
[2015-08-30 21:28:20 JST] 2727[6]LOG: parameter "log_min_duration_statement" changed to "10000"
[2015-08-30 21:29:26 JST]testuser postgres 17060[1]LOG: duration: 63122.171 ms statement: select * from pgbench_accounts where aid>5000;
<上記ログ出力から確認できるスロークエリに関する情報>
----------------------------------------------------------------------------------------------------
検出時刻:2015-08-30 21:29:26
処理を実行したユーザー名:testuser
接続先データベース名:postgres
OSのPID:17060
PID 17060に関連するメッセージ1:LOG: duration: 63122.171 ms statement: select * from pgbench_accounts where aid>5000;
スロークエリ:select * from pgbench_accounts where aid>5000;
所要時間:63122.171 ms (約63秒)
----------------------------------------------------------------------------------------------------
今回は、障害発生に備えて設定すべきパラメーターとして、logging_collector、log_line_prefix、log_min_duration_statementの3つをご紹介しました。これらを設定いただくことで、障害発生時の状況把握、問題解決がスムーズになりますので、ぜひこれを機に設定の有無を確認してみてください。
なお、今回紹介したパラメーター以外にもPostgreSQLの状況把握に役立つログ関連パラメーターは複数存在しますので、興味のある方は
マニュアル
もあわせてご参照ください。
■本記事の内容について
本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。
■商標に関して
・Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。
EDB Postgres Workload Reportsは、Postgresデータベースのパフォーマンス診断とトラブルシューティングを強化する新しいツールです。OracleのAWRに似た詳細なレポートを提供し、データベースの問題を迅速に特定・解決できるようサポートします。本記事では概要と利用手順をご紹介します。
35年以上教育事業を展開しているアシストが新たに取り組み始めた「ポスグレ学園」。連載10回目となる今回の記事では、OSS-DB Gold試験対策問題集 出版の経緯や内容を 新校長 我妻にインタビューしました。
EDB社のAjit Gadge氏を招き「PostgreSQLユーザーに捧ぐ、EDBを使ったDB機能向上とコスト削減の両立」セミナーを開催しました。DB市場の現状やトレンド、EDBの最新動向について紹介しております。アシストセッションのアーカイブ配信の視聴申し込みも可能です。ぜひご覧ください。