F.37. pg_walinspect #
pg_walinspect 模块提供一组 SQL 函数,允许在底层检查正在运行的 PostgreSQL
数据库集簇的预写式日志内容,这对于调试、分析、报表或教学用途很有帮助。它与 pg_waldump 类似,但可通过 SQL 访问,而不是通过独立工具。
该模块的所有函数都基于服务器当前时间线 ID 提供 WAL 信息。
本模块的所有函数都会尝试查找位于给定 in_lsn 或 start_lsn 处或其后的第一条有效 WAL 记录;若找不到这样的记录,则会报错。同样,end_lsn 也必须可用;如果它位于一条记录的中间,则整条记录都必须可用。
注意
某些函数(例如 pg_logical_emit_message)返回刚插入的记录之后的 LSN。因此,如果将该 LSN 作为 in_lsn 或 start_lsn 传给这些函数之一,返回的将是下一条记录。
默认情况下,这些函数仅允许超级用户和
pg_read_server_files 角色成员使用。超级用户可通过 GRANT 向其他用户授予访问权限。
F.37.1. 通用函数 #
-
pg_get_wal_record_info(in_lsn pg_lsn) returns record# 获取给定 LSN 处的 WAL 记录信息。如果给定 LSN 不在 WAL 记录的起始位置,则返回下一条可用的有效 WAL 记录的信息;若找不到这样的记录,则会报错。例如,该函数的用法如下:
postgres=# SELECT * FROM pg_get_wal_record_info('0/1E826E98'); -[ RECORD 1 ]----+---------------------------------------------------- start_lsn | 0/1E826F20 end_lsn | 0/1E826F60 prev_lsn | 0/1E826C80 xid | 0 resource_manager | Heap2 record_type | PRUNE record_length | 58 main_data_length | 8 fpi_length | 0 description | snapshotConflictHorizon 33748 nredirected 0 ndead 2 block_ref | blkref #0: rel 1663/5/60221 fork main blk 2-
pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn) returns setof record# 获取
start_lsn与end_lsn之间所有有效 WAL 记录的信息。每条 WAL 记录返回一行。如果start_lsn或end_lsn尚不可用,则函数会报错。例如: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 |-
pg_get_wal_records_info_till_end_of_wal(start_lsn pg_lsn) returns setof record# 此函数与
pg_get_wal_records_info()相同,但获取的是从start_lsn到 WAL 末尾之间所有有效 WAL 记录的信息。-
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返回一行。如果start_lsn或end_lsn尚不可用,则函数会报错。例如: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-
pg_get_wal_stats_till_end_of_wal(start_lsn pg_lsn, per_record boolean DEFAULT false) returns setof record# 此函数与
pg_get_wal_stats()相同,但获取的是从start_lsn到 WAL 末尾之间所有有效 WAL 记录的统计信息。
F.37.2. 作者 #
Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.