★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

F.37. pg_walinspect — 低レベルのWAL検査 #

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を使用して他のユーザにアクセスを許可できます。

F.37.1. 一般的な関数 #

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_lsnend_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_lsnend_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_lsnblock_id値の組み合わせを持つことが保証されています。

ここに示す情報の多くは、pg_get_wal_records_infoに同じ引数を与えた場合に出力される出力と一致します。 しかし、pg_get_wal_block_infoは、各WALレコードをブロック参照ごとに展開した形式で情報を展開するため、ブロック参照レベルでは全体のレコードよりも多くの行が出力されます。 この構造は、個々のブロックが時間の経過とともにどのように変化したかを追跡する問い合わせで役立ちます。 ブロック参照を持たないレコード(例えば、COMMITWALレコード)は行を返さないので、pg_get_wal_block_infoは実際にはpg_get_wal_records_infoよりも少ない行を返すかもしれません。

reltablespacereldatabaserelfilenodeパラメータは、pg_tablespace.oidpg_database.oidpg_class.oidpg_class.relfilenodeを参照します。 relforknumberは、ブロック参照のリレーション内のフォーク番号です。 詳細はcommon/relpath.hを参照してください。

ヒント

pg_filenode_relation関数(表 9.97を参照)は、元の実行中にどのリレーションが変更されたかを判断するのに役立ちます。

クライアントは、ブロックデータの取り出しによるオーバーヘッドを回避することができます。 これにより、関数の実行が大幅に高速化されます。 show_datafalseに設定されている場合、block_datablock_fpi_dataの値は省略されます(つまり、返されたすべての行に対してblock_datablock_fpi_dataOUT引数はNULL)。 明らかに、この最適化はブロックデータが本当に必要でない問い合わせでのみ許されます。

start_lsnが利用できない場合、この関数はエラーを発生します。

pg_get_wal_stats(start_lsn pg_lsn, end_lsn pg_lsn, per_record boolean DEFAULT false) returns setof record #

start_lsnend_lsnの間のすべての有効なWALレコードの統計を取得します。 デフォルトでは、resource_manager型ごとに1つの行を返します。 per_recordtrueに設定されている場合、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が利用できない場合、この関数はエラーを発生します。

F.37.2. 作者 #

Bharath Rupireddy