F.37. pg_walinspect — low-level WAL inspection #

pg_walinspectモジュールは、実行中のPostgreSQLデータベースクラスタの先行書き込みログの内容を低レベルで検査することを可能にするSQL関数を提供します。 これはデバッグ、分析、報告、教育目的に有用です。 pg_waldumpと似ていますが、独立したユーティリティではなくSQLを通してアクセスできます。

《マッチ度[84.761905]》このモジュールのすべての関数は、現在のサーバのタイムラインIDを使ってWAL情報を提供します。 《機械翻訳》このモジュールのすべての関数は、サーバの現在のタイムラインIDを使用してWAL情報を提供します。

注記

《機械翻訳》pg_walinspect関数は、しばしば、関心のある既知のWALレコードの位置を指定するLSN引数を使用して呼び出されます。 しかし、pg_logical_emit_messageのようないくつかの関数は、挿入されたレコードのにLSNを返します。

ヒント

《機械翻訳》pg_walinspect関数の中には、あるLSN範囲内にあるレコードに関する情報を表示する関数は、サーバの現在の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_record_infoが同じ引数を与えた場合に出力される出力と一致します。 しかし、pg_get_wal_block_infoは、各WALレコードをブロック参照ごとに展開した形式で情報を展開するため、ブロック参照レベルでは全体のレコードよりも多くの行が出力されます。 この構造は、個々のブロックが時間の経過とともにどのように変化したかを追跡するクエリで役立ちます。 ブロック参照を持たないレコード(例えば、COMMITWALレコード)は行を返さないので、pg_get_wal_block_infoは実際にはpg_get_wal_record_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レコードの統計を取得します。 デフォルトでは、per_recordごとに1つの行を返します。 per_recordtrueに設定されている場合、resource_manager/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