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
函数(参见
表 9.97)可以帮助您确定
在原始执行期间修改了哪个关系。
客户端可以避免物化块数据的开销。这可能会显著加快函数执行速度。
当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>