Postgresql 中文操作指南

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

pg_walinspect 模块提供SQL函数,可用于以较低级别检查正在运行的PostgreSQL数据库集群的预写日志的内容,这对于调试、分析、报告或教育目的非常有用。它类似于 pg_waldump ,但可以通过SQL而不是单独的实用程序访问。

此模块的所有函数都将使用服务器的当前时间线 ID 提供 WAL 信息。

Note

pg_walinspect 函数通常使用LSN参数进行调用,该参数指定感兴趣的已知WAL记录 begins 的位置。但是,某些函数(例如 _ pg_logical_emit_message_ )会返回刚插入的记录的LSN after

Tip

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. General Functions #

  • 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 记录返回一行。例如:

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 #

  • 从所有在_start_lsn_和_end_lsn_之间包含一个或多个块引用的有效 WAL 记录中获取每个块引用的信息。为每个 WAL 记录的每个块引用返回一行。例如:

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    |
  • 此示例涉及只包含一个块引用的 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_行而不是_fewer_行。

  • reltablespacereldatabaserelfilenode 参数分别引用 pg_tablespace . oidpg_database . oidpg_class . relfilenoderelforknumber 字段是块引用的关系中的分叉号;有关详细信息,请参阅 common/relpath.h

  • 客户端可以避免实体化块数据的开销。这可以使函数执行速度提高很多。当 show_data 设置为 false 时,将省略 block_datablock_fpi_data 值(即,所有返回行的 block_datablock_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_类型返回一行。当_per_record_设置为_true_时,它为每个_record_type_返回一行。例如:

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_不可用,则该函数会引发一个错误。

Tip

pg_filenode_relation 函数(参见 Table 9.97)可帮助你确定在原始执行期间修改了哪个关系。