pg_walinspect模块提供了SQL函数,允许您检查运行中的PostgreSQL数据库集群的预写式日志的内容,这对于调试、分析、报告或教育目的非常有用。它类似于pg_waldump,但是通过SQL而不是单独的实用程序访问。
本模块的所有功能都将使用服务器当前的时间线ID提供WAL信息。
pg_walinspect 函数通常使用一个 LSN 参数调用,该参数指定感兴趣的已知
WAL 记录开始的位置。然而,一些函数,例如
pg_logical_emit_message,
返回刚插入的记录之后的 LSN。
所有pg_walinspect函数显示在特定LSN范围内的记录信息时,
对于接受end_lsn参数(即使该参数超出了服务器当前
的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记录返回一行。例如:
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
#
获取从所有有效的WAL记录中每个块引用的信息,这些记录位于
start_lsn和end_lsn
之间,并包含一个或多个块引用。每个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。
reltablespace、
reldatabase和
relfilenode参数引用
pg_tablespace.oid、
pg_database.oid和
pg_class.relfilenode,
分别对应。relforknumber
字段是块引用中关系的分叉编号;详情请参见common/relpath.h。
pg_filenode_relation 函数(参见
Table 9.101)可以帮助您确定
在原始执行期间修改了哪个关系。
客户端可以避免物化块数据的开销。这可能会显著加快函数执行速度。
当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
类型返回一行。当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不可用,该函数会引发错误。
Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>