pg_walinspect
モジュールは、実行中のPostgreSQLデータベースクラスタの先行書き込みログの内容を低レベルで検査することを可能にするSQL関数を提供します。
これはデバッグ、分析、報告、教育目的に有用です。
pg_waldumpと似ていますが、独立したユーティリティではなくSQLを通してアクセスできます。
このモジュールのすべての関数は、サーバの現在のタイムラインIDを使用してWAL情報を提供します。
pg_walinspect
関数は、しばしば、関心のある既知のWALレコードの開始位置を指定するLSN引数を使用して呼び出されます。
しかし、pg_logical_emit_message
のようないくつかの関数は、挿入されたレコードの後のLSNを返します。
あるLSN範囲内にあるレコードに関する情報を表示するpg_walinspect
関数はすべて、サーバの現在のLSNより後のend_lsn
引数を受け入れることに対して寛容です。
「未来の」end_lsn
を使用することはエラーを引き起こしません。
FFFFFFFF/FFFFFFFF
(最大有効pg_lsn
値)をend_lsn
引数として指定すると便利です。
これは、サーバの現在のLSNに一致するend_lsn
引数を指定することと同じです。
デフォルトでは、これらの関数の使用はスーパーユーザとpg_read_server_files
ロールのメンバに制限されています。
スーパーユーザはGRANT
を使用して他のユーザにアクセスを許可できます。
pg_get_wal_record_info(in_lsn pg_lsn) returns record
#
in_lsn
引数以降のレコードに関するWALレコード情報を取得します。
例を示します。
postgres=# SELECT * FROM pg_get_wal_record_info('0/E419E28'); -[ RECORD 1 ]----+------------------------------------------------- start_lsn | 0/E419E28 end_lsn | 0/E419E68 prev_lsn | 0/E419D78 xid | 0 resource_manager | Heap2 record_type | VACUUM record_length | 58 main_data_length | 2 fpi_length | 0 description | nunused: 5, unused: [1, 2, 3, 4, 5] block_ref | blkref #0: rel 1663/16385/1249 fork main blk 364
in_lsn
がWALレコードの先頭にない場合、次の有効なWALレコードに関する情報が代わりに表示されます。
次の有効なWALレコードがない場合、関数はエラーを発生します。
pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn)
returns setof record
#
start_lsn
とend_lsn
の間のすべての有効なWALレコードの情報を取得します。
WALレコードごとに1つの行が返されます。
例を示します。
postgres=# SELECT * FROM pg_get_wal_records_info('0/1E913618', '0/1E913740') LIMIT 1; -[ RECORD 1 ]----+-------------------------------------------------------------- start_lsn | 0/1E913618 end_lsn | 0/1E913650 prev_lsn | 0/1E9135A0 xid | 0 resource_manager | Standby record_type | RUNNING_XACTS record_length | 50 main_data_length | 24 fpi_length | 0 description | nextXid 33775 latestCompletedXid 33774 oldestRunningXid 33775 block_ref |
start_lsn
が利用できない場合、この関数はエラーを発生します。
pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn, show_data boolean DEFAULT true) returns setof record
pg_get_wal_records_info_till_end_of_wal(start_lsn pg_lsn)
returns setof record
#
start_lsn
とend_lsn
の間のすべての有効なWALレコードから、1つ以上のブロック参照を持つすべてのブロック参照に関する情報を取得します。
WALレコードのブロック参照ごとに1行返します。
例を示します。
postgres=# SELECT * FROM pg_get_wal_block_info('0/1230278', '0/12302B8'); -[ RECORD 1 ]-----+----------------------------------- start_lsn | 0/1230278 end_lsn | 0/12302B8 prev_lsn | 0/122FD40 block_id | 0 reltablespace | 1663 reldatabase | 1 relfilenode | 2658 relforknumber | 0 relblocknumber | 11 xid | 341 resource_manager | Btree record_type | INSERT_LEAF record_length | 64 main_data_length | 2 block_data_length | 16 block_fpi_length | 0 block_fpi_info | description | off: 46 block_data | \x00002a00070010402630000070696400 block_fpi_data |
この例は、1つのブロック参照のみを含むWALレコードを含んでいますが、多くのWALレコードには複数のブロック参照が含まれています。
pg_get_wal_block_info
によって出力される行は、一意のstart_lsn
とblock_id
値の組み合わせを持つことが保証されています。
ここに示す情報の多くは、pg_get_wal_records_info
に同じ引数を与えた場合に出力される出力と一致します。
しかし、pg_get_wal_block_info
は、各WALレコードをブロック参照ごとに展開した形式で情報を展開するため、ブロック参照レベルでは全体のレコードよりも多くの行が出力されます。
この構造は、個々のブロックが時間の経過とともにどのように変化したかを追跡する問い合わせで役立ちます。
ブロック参照を持たないレコード(例えば、COMMIT
WALレコード)は行を返さないので、pg_get_wal_block_info
は実際にはpg_get_wal_records_info
よりも少ない行を返すかもしれません。
reltablespace
、reldatabase
、relfilenode
パラメータは、pg_tablespace
.oid
、pg_database
.oid
、pg_class
.oid
、pg_class
.relfilenode
を参照します。
relforknumber
は、ブロック参照のリレーション内のフォーク番号です。
詳細はcommon/relpath.h
を参照してください。
pg_filenode_relation
関数(表 9.97を参照)は、元の実行中にどのリレーションが変更されたかを判断するのに役立ちます。
クライアントは、ブロックデータの取り出しによるオーバーヘッドを回避することができます。
これにより、関数の実行が大幅に高速化されます。
show_data
がfalse
に設定されている場合、block_data
とblock_fpi_data
の値は省略されます(つまり、返されたすべての行に対してblock_data
とblock_fpi_data
のOUT
引数はNULL
)。
明らかに、この最適化はブロックデータが本当に必要でない問い合わせでのみ許されます。
start_lsn
が利用できない場合、この関数はエラーを発生します。
pg_get_wal_stats(start_lsn pg_lsn, end_lsn pg_lsn, per_record boolean DEFAULT false)
returns setof record
#
start_lsn
とend_lsn
の間のすべての有効なWALレコードの統計を取得します。
デフォルトでは、resource_manager
型ごとに1つの行を返します。
per_record
がtrue
に設定されている場合、record_type
ごとに1つの行を返します。
例を示します。
postgres=# SELECT * FROM pg_get_wal_stats('0/1E847D00', '0/1E84F500') WHERE count > 0 AND "resource_manager/record_type" = 'Transaction' LIMIT 1; -[ RECORD 1 ]----------------+------------------- resource_manager/record_type | Transaction count | 2 count_percentage | 8 record_size | 875 record_size_percentage | 41.23468426013195 fpi_size | 0 fpi_size_percentage | 0 combined_size | 875 combined_size_percentage | 2.8634072910530795
start_lsn
が利用できない場合、この関数はエラーを発生します。
Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>