Redrock Postgres 搜索 英文
版本: 15 / 16 / 17

F.35. pg_walinspect - 底层 WAL 检查 #

F.35.1. 常规函数
F.35.2. 作者

pg_walinspect 模块提供了 SQL 函数,让您可以低级别检查运行的 PostgreSQL 数据库集群的预写日志内容,用于调试、分析、报告或教育目的。它类似于 pg_waldump,但可以通过 SQL 而非独立实用程序进行访问。

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

注意

pg_walinspect 函数通常使用指定感兴趣的已知 WAL 记录开始 位置的 LSN 参数进行调用。但是,某些函数(例如 pg_logical_emit_message)返回刚刚插入的记录之后 的 LSN。

提示

所有显示有关在特定 LSN 范围内记录信息的 pg_walinspect 函数都会允许接受服务器当前 LSN 之后的end_lsn 参数。使用“未来”(即超出服务器当前 LSN)的end_lsn 不会引发错误。

将值 FFFFFFFF/FFFFFFFF(最大有效 pg_lsn 值)作为end_lsn 参数可能很方便。这相当于提供与服务器当前 LSN 匹配的end_lsn 参数。

默认情况下,只有超级用户和 pg_read_server_files 角色的成员才能使用这些函数。超级用户可以使用 GRANT 向其他人授予访问权限。

F.35.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 记录返回一行。例如

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_lsnend_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_lsnblock_id 值组合。

此处显示的信息大部分与 pg_get_wal_records_info 给出相同参数后显示的输出匹配。然而,pg_get_wal_block_info 将每个 WAL 记录的信息按展开形式分解,按块级引用输出一行,因此特定详细信息是在块级引用进行跟踪,而非在整个记录级别进行跟踪。此结构对于跟踪各块如何随着时间推移而更改的查询很有用。请注意,没有块级引用(例如 COMMIT WAL 记录)的记录将不会返回任何行,因此,pg_get_wal_block_info 实际返回的行数可能比 pg_get_wal_records_info

reltablespacereldatabaserelfilenode 参数引用 pg_tablespace.oidpg_database.oidpg_class.relfilenoderelforknumber 字段是块引用所在关系中的 fork 号,有关详细信息请参阅 common/relpath.h

提示

pg_filenode_relation 函数(请参阅 表格 9.101)可以帮助您确定原始执行期间修改了哪个关系。

客户端可以避免进行块数据实例化的开销。这可能会使函数的执行速度显著加快。当 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_lsnend_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 不可获得,则函数会引发错误。

F.35.2. 作者 #

Bharath Rupireddy