Japan
サイト内の現在位置
PostgreSQL
pg_statsinfoを用いたデータベースの監視~後編~
本ページでは、pg_statsinfoの機能のうち、ログを加工する機能や、日々蓄積されるログやスナップショットを自動でメンテナンスする機能など、システム運用を効率化する機能についてご紹介します。
また、pg_statsinfoの概要についてはこちらで解説していますので合わせてご覧ください。
pg_statsinfoの機能
pg_statsinfoでは以下のことができます。
ⅰ) 統計情報の取得
ⅱ) 簡易レポートの出力
ⅲ) サーバーログの分配
ⅳ) サーバーログの蓄積
ⅴ) アラートログ機能
ⅵ) 自動メンテナンス
以下は各機能の全体図です。各項目の詳細は後述します。

pg_statsinfoの使い方
上記で紹介したpg_statsinfoの各機能のうち、ⅲ) サーバーログの分配、ⅳ) サーバーログの蓄積、ⅵ) 自動メンテナンスについて詳細を説明します。その他の機能についてはpg_statsinfoを用いたデータベースの監視~前編~で詳しく解説していますので合わせてご覧ください。
ⅲ) サーバーログの分配
監視対象であるPostgreSQL本体のサーバーログ(CSV形式)をもとにtextlogとsyslogを出力(分配)します。ユーザーは、ログのメッセージレベルを指定することで出力内容をフィルタリングしたり、書式、ファイル名を自由に設定することができます。

1. 設定ファイル(postgresql.conf)の修正
$ vi /var/lib/pgsql/14/data/postgresql.conf
#下記の通りパラメータを指定し上書き保存
log_min_messages = 'error' # サーバーログへ出力するメッセージレベル
pg_statsinfo.textlog_min_messages = 'log' # textlogへ出力するメッセージレベル
pg_statsinfo.syslog_min_messages = 'error' # syslogに出力するメッセージレベル
それぞれのパラメータで指定した値より低位のログは出力されません。また、ユーザーはテキストログの書式やファイル名などを任意の内容に設定することができます。
2. エラーの発生
設定が反映されていることを確認するため、エラーの発生を再現します。
$ psql -c "SELECT 1/0"
ERROR: 0による除算が行われました
3. サーバログの分配の確認
PostgreSQL本体のサーバログをもとにtextlogとsyslogが出力されていることを確認します。
$ cat /var/lib/pgsql/14/data/log/postgresql-2023-03-06_000000.csv | grep ERROR #サーバーログ
2023-03-06 08:54:29.337 JST,"postgres","postgres",628354,"[local]",64052bb5.99682,1,"SELECT",2023-03-06 08:54:29 JST,7/95,0,ERROR,22012,"0による除算が行われました",,,,,,"select 1/0",,,"psql","client backend",,-8441324848661855122
$ cat /var/lib/pgsql/14/data/log/pg_statsinfo.log | grep ERROR #textlog
# tail -n 20 /var/log/messages #syslog
(略)
Mar 6 08:54:29 localhost postgres[283179]: [19116-1] 2023-03-06 08:54:29 JST 628354 64052bb5.99682-1 0 (postgres, postgres, [local], psql) ERROR: 0による除算が行われましたMar 6 08:54:29 localhost postgres[283179]: [19116-2] 2023-03-06 08:54:29 JST 628354 64052bb5.99682-1 0 (postgres, postgres, [local], psql) STATEMENT: select 1/0
textlogはメッセージレベルを「pg_statsinfo.textlog_min_messages = 'log' 」に指定したため、エラーはログ出力されません。サーバーログとsyslogはメッセージレベルを"error"に指定したためエラーが出力されています。サーバーログの内容をもとにsyslogが出力されていることが確認できます。
ⅳ) サーバーログの蓄積
PostgreSQL が出力するサーバログを収集し、リポジトリDB(収集情報を格納するためのDB)に保存します。

1. 蓄積ログテーブルのレコードの削除
あとの操作で追加されたレコードを確認しやすくするためにリポジトリーDB内の蓄積ログテーブルを空にします。
$ psql -c "TRUNCATE TABLE statsrepo.log"
TRUNCATE TABLE
2. 設定ファイル(postgresql.conf)の修正
$ vi /var/lib/pgsql/14/data/postgresql.conf
#下記の通りパラメータを指定し上書き保存
log_min_messages = 'log' # ログへ出力するメッセージレベル
pg_statsinfo.repolog_min_messages = 'log' # 蓄積ログテーブルへ出力するメッセージレベル
ここで指定した値より低位のログは出力されません。
3. ログの確認
textlogの内容がリポジトリーDB内の蓄積ログテーブルに反映されていることを確認します。

textlogと同じ内容が蓄積ログテーブル内にレコード形式で格納されていることが確認できます。
ⅵ) 自動メンテナンス機能
毎日指定した時刻に以下のメンテナンスを自動で行います。
内容 |
説明 |
---|---|
古い統計情報の削除 |
指定日数以上保持されているスナップショットを削除する |
古い蓄積ログの削除 |
指定日数以上保持されている蓄積ログテーブル内のレコードを削除する |
古いサーバーログ ファイルの整理 |
・PostgreSQL本体のログディレクトリ内にある前日以前のサーバーログをサブディレクトリにアーカイブ/圧縮して格納する |

1. 設定ファイル(postgresql.conf)の修正
以下に自動メンテナンスを行うための設定例を示します。
$ vi /var/lib/pgsql/14/data/postgresql.conf
#下記の通りパラメータを指定し上書き保存
pg_statsinfo.enable_maintenance = 'on' # 自動メンテナンス設定
pg_statsinfo.maintenance_time = '00:10:00' # 自動メンテナンス実行時刻設定
pg_statsinfo.repolog_min_messages = 'log' # ログ蓄積機能の設定
pg_statsinfo.repository_keepday = 1 # スナップショットの保持期間設定(日数)
pg_statsinfo.repolog_keepday = 1 # 蓄積ログの保持期間設定(日数)
pg_statsinfo.log_maintenance_command = '/usr/pgsql-14/bin/archive_pglog.sh %l' # ログファイル整理コマンド設定
2. 古いスナップショットが削除されていることの確認
1. の設定ではメンテナンス実行日の1日前の午前0時より前のスナップショットが削除されます。
例として2/16のメンテナンスの実行前後のスナップショットの一覧を示します。実行後は1日前である2/15の午前0時より前(2/14 23:59:59以前)のスナップショットが削除されていることが確認できます。
・メンテナンス実行前のスナップショット一覧
$ pg_statsinfo -l
----------------------------------------
Snapshot List
----------------------------------------
SnapshotID InstanceID Host Port Timestamp Comment Execute Time Size
-----------------------------------------------------------------------------------------------------------------------------------------
13 1 localhost.localdomain 5432 2023-02-13 10:45:48 00:00:00 216 KiB
14 1 localhost.localdomain 5432 2023-02-15 14:30:00 00:00:01 256 KiB
(中略)
1453 1 localhost.localdomain 5432 2023-02-16 14:29:00 00:00:00 296 KiB
・メンテナンス実行後のスナップショット一覧
$ pg_statsinfo -l
----------------------------------------
Snapshot List
----------------------------------------
SnapshotID InstanceID Host Port Timestamp Comment Execute Time Size
-----------------------------------------------------------------------------------------------------------------------------------------
14 1 localhost.localdomain 5432 2023-02-15 14:30:00 00:00:01 256 KiB
(中略)
1453 1 localhost.localdomain 5432 2023-02-16 14:29:00 00:00:00 296 KiB
蓄積ログについても同様で、メンテナンス実行日の1日前の午前0時より前の蓄積ログが削除されます。
3. 古いサーバーログがアーカイブ/圧縮して格納されていることの確認
1. の設定ではサーバーログについては、メンテナンス実行日の午前0時が境界となります。
以下の例では2/16のメンテナンス実行前後を示しており、メンテナンス実行日である2/16の午前0時より前(2/15 23:59:59以前)のサーバーログが削除されていることが確認できます。
・メンテナンス実行前のログディレクトリ
$ ls -lt /var/lib/pgsql/14/data/log
合計 1400
-rw-------. 1 postgres postgres 280013 2月 16 14:43 pg_statsinfo.log
-rw-------. 1 postgres postgres 333232 2月 16 14:43 postgresql-2023-02-16_000000.csv
-rw-------. 1 postgres postgres 0 2月 16 00:00 postgresql-2023-02-16_000000.log
-rw-------. 1 postgres postgres 314884 2月 15 23:58 postgresql-2023-02-15_140246.log
-rw-------. 1 postgres postgres 375770 2月 15 23:58 postgresql-2023-02-15_140246.csv
-rw-------. 1 postgres postgres 317 2月 15 14:02 postgresql-2023-02-15_140246.log.copy
・メンテナンス実行後のログディレクトリ
$ ls -lt /var/lib/pgsql/14/data/log
合計 1400
-rw-------. 1 postgres postgres 280013 2月 16 14:43 pg_statsinfo.log
-rw-------. 1 postgres postgres 333232 2月 16 14:43 postgresql-2023-02-16_000000.csv
-rw-------. 1 postgres postgres 0 2月 16 00:00 postgresql-2023-02-16_000000.log
本ページでは、pg_statsinfoのログを加工する機能や、ログやスナップショットの自動メンテナンス機能についてご紹介しました。その他の機能である統計情報の取得や簡易レポートの出力、アラート機能についてはpg_statsinfoを用いたデータベースの監視~前編~で詳しく解説していますので合わせてご覧ください。
Advancedサポートサービスのご紹介
PostgreSQL保守Advancedサポートサービスでは、PostgreSQL技術者による24時間365日体制のサポートのもと、PostgreSQLの技術的な問い合わせや、障害調査、pg_statsinfoを含む指定のOSSツールのサポートに対応します。詳細はこちらをご覧ください。
お問い合わせ