Japan

関連リンク

関連リンク

関連リンク

関連リンク

サイト内の現在位置

PostgreSQL

pg_statsinfoを用いたデータベースの監視~後編~

本ページでは、pg_statsinfoの機能のうち、ログを加工する機能や、日々蓄積されるログやスナップショットを自動でメンテナンスする機能など、システム運用を効率化する機能についてご紹介します。
また、pg_statsinfoの概要についてはこちらで解説していますので合わせてご覧ください。

pg_statsinfoの機能

pg_statsinfoでは以下のことができます。
ⅰ) 統計情報の取得
ⅱ) 簡易レポートの出力
ⅲ) サーバーログの分配
ⅳ) サーバーログの蓄積
ⅴ) アラートログ機能
ⅵ) 自動メンテナンス
以下は各機能の全体図です。各項目の詳細は後述します。

図1 機能全体図

pg_statsinfoの使い方

上記で紹介したpg_statsinfoの各機能のうち、ⅲ) サーバーログの分配、ⅳ) サーバーログの蓄積、ⅵ) 自動メンテナンスについて詳細を説明します。その他の機能についてはpg_statsinfoを用いたデータベースの監視~前編~で詳しく解説していますので合わせてご覧ください。

ⅲ) サーバーログの分配

監視対象であるPostgreSQL本体のサーバーログ(CSV形式)をもとにtextlogとsyslogを出力(分配)します。ユーザーは、ログのメッセージレベルを指定することで出力内容をフィルタリングしたり、書式、ファイル名を自由に設定することができます。

図2 サーバログの分配

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)に保存します。

図3 サーバーログの蓄積

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と同じ内容が蓄積ログテーブル内にレコード形式で格納されていることが確認できます。

ⅵ) 自動メンテナンス機能

毎日指定した時刻に以下のメンテナンスを自動で行います。

表1 自動メンテナンス内容
内容

説明

古い統計情報の削除

指定日数以上保持されているスナップショットを削除する

古い蓄積ログの削除

指定日数以上保持されている蓄積ログテーブル内のレコードを削除する

古いサーバーログ
ファイルの整理

・PostgreSQL本体のログディレクトリ内にある前日以前のサーバーログをサブディレクトリにアーカイブ/圧縮して格納する
・ログディレクトリ内にあるアーカイブ済のサーバーログを全て削除する

図4 自動メンテナンス

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ツールのサポートに対応します。詳細はこちらをご覧ください。

お問い合わせ

Escキーで閉じる 閉じる