PostgreSQL数据库之使用 pg_waldump 和 pg_walinspect 查看 WAL 文件的内容

pg_waldump 支持 12 及以上版本;pg_walinspect 支持 15 及以上版本。

pg_waldump

pg_waldump 可从 WAL 文件段中展示人类可读的信息。
pg_waldump 使用要求

将 wal_level 设置为 "replica" 或更高级别;在 RDS 上,将 wal_level 设置为 "logical"

安装 postgresql server 的用户或拥有数据目录读取权限的用户才能使用 pg_waldump

查看 PostgreSQL 的 WAL (预写日志) 文件内容,pg_waldumppg_walinspect 是两个核心工具。它们各有特点,适用于不同的场景。下面我来为你详细解释它们的用法和区别。

为了让你快速建立整体印象,这里有一个对比表格:

特性维度 pg_waldump (命令行工具) pg_walinspect (SQL 扩展)
运行方式 独立的命令行工具,在操作系统层面执行 PostgreSQL 扩展,通过 SQL 查询在数据库会话中执行
主要用途 调试、教育目的 调试、分析、报告、教育目的
核心优势 无需连接数据库 、灵活过滤、可实时跟踪 (-f) SQL集成 ,便于关联系统表 、结果可被进一步计算与聚合
访问控制 需服务器文件系统读取权限(通常是安装PostgreSQL的用户) 需数据库内权限(默认超级用户 或**pg_read_server_files**角色成员)
输出格式 固定的纯文本格式 结构化结果集(可像普通表一样查询、筛选、连接)

🛠️ 使用 pg_waldump

pg_waldump 是一个在操作系统命令行中使用的工具,适合直接分析WAL文件。

  • 基本命令格式

    bash 复制代码
    pg_waldump [选项...] [起始段 [结束段]]
  • 常用选项

    选项 说明
    -p <路径> 指定 WAL 文件或包含pg_wal子目录的路径
    -s <LSN> 从指定的 LSN 开始读取
    -e <LSN> 在指定的 LSN 停止读取
    -n <数量> 限制显示的记录数量
    -f 实时跟踪模式,到达日志末尾后继续轮询新记录
    -r <资源管理器> 仅显示指定资源管理器的记录(如 HeapBtreeTransaction),使用 list 查看所有
    --stats 显示统计摘要而非详细记录
  • 典型用法示例

    1. 解析特定WAL段文件

      bash 复制代码
      pg_waldump -p /var/lib/postgresql/data/pg_wal 0000000100001234000000AB

      这会将 0000000100001234000000AB 这个WAL文件的内容以人类可读的形式输出。

    2. 从特定LSN开始并限制记录数

      bash 复制代码
      pg_waldump -s 0/12345678 -n 5 -p /var/lib/postgresql/data/pg_wal

      这会从 LSN 0/12345678 开始,只显示5条记录。

    3. 按资源管理器过滤并显示统计信息

      bash 复制代码
      pg_waldump -r Heap --stats -p /var/lib/postgresql/data/pg_wal 0000000100001234000000A9 0000000100001234000000AC

      这会解析从 ...A9...AC 的几个文件,但只关注与堆表操作相关的记录,最后给出统计摘要。

🗄️ 使用 pg_walinspect

pg_walinspect 模块提供了用于检查和调试 WAL 的 SQL 函数,这些函数可以通过 SQL 而不是单独的工具访问。
pg_walinspect 是一个 PostgreSQL 扩展,允许你通过 SQL 查询来检查 WAL,非常适合与数据库系统表关联分析。

  • 启用扩展

    首先,需要在你要使用的数据库中创建扩展:

    sql 复制代码
    CREATE EXTENSION pg_walinspect;
  • 核心函数

    函数名 功能描述
    pg_get_wal_records_info(start_lsn, end_lsn) 获取两个LSN间所有有效WAL记录的详细信息
    pg_get_wal_record_info(in_lsn) 获取指定LSN处(或之后第一个)单个WAL记录的信息
    pg_get_wal_stats(start_lsn, end_lsn) 获取两个LSN间WAL记录的统计信息(默认按资源管理器分组)
  • 典型用法示例

    1. 检查一段时间内的WAL记录

      sql 复制代码
      SELECT start_lsn, end_lsn, xid, resource_manager, record_type, description 
      FROM pg_get_wal_records_info('0/156BA88', '0/156E768');

      这会返回指定LSN范围内的WAL记录,包含事务ID、资源管理器、记录类型等关键信息。

    2. 关联系统表,获取更详细的信息

      sql 复制代码
      SELECT w.start_lsn, w.record_type, w.description, c.relname
      FROM pg_get_wal_records_info('0/156BA88', '0/156E768') w
      LEFT JOIN pg_class c ON w.reloid = c.oid; -- 注意:实际可能需要根据函数返回的字段调整关联条件

      这个例子展示了如何将WAL记录与系统目录(如pg_class)连接,以直接看到涉及的表名。

    3. 分析WAL体积分布

      sql 复制代码
      SELECT resource_manager, 
             count(*) as count,
             pg_size_pretty(sum(record_length)) as total_size
      FROM pg_get_wal_records_info('0/156BA88', '0/156E768') 
      GROUP BY resource_manager
      ORDER BY total_size DESC;

      这个查询可以帮你分析在指定的WAL区间内,哪种类型的操作产生的日志量最大。

💡 重要提示和注意事项

  1. 权限是关键 :确保你以正确的权限运行这些工具。pg_waldump 需要访问数据库服务器文件系统,而 pg_walinspect 需要在数据库内有相应的权限。
  2. 服务器运行时解析 :官方文档提到,在服务器运行时使用 pg_waldump 可能得到错误的结果。虽然在实际操作中(尤其是不繁忙的备库或轻载主库)常直接使用,但对于严格的生产环境分析,建议解析已归档的WAL文件或确保在安全的时机进行。
  3. 理解输出 :WAL记录包含大量底层信息。理解 resource_managerrecord_typedescription 等字段的含义,需要一定的PostgreSQL内核知识。
  4. LSN的可用性 :使用 pg_walinspect 的函数时,传入的LSN必须是服务器上可用的。
相关推荐
Elastic 中国社区官方博客2 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.6 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐11 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_999913 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
七牛云行业应用36 分钟前
Moltbook一夜崩盘:150万密钥泄露背后的架构“死穴”与重构实战
网络安全·postgresql·架构·高并发·七牛云
自不量力的A同学1 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 小时前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道2 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议