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_waldump 和 pg_walinspect 是两个核心工具。它们各有特点,适用于不同的场景。下面我来为你详细解释它们的用法和区别。
为了让你快速建立整体印象,这里有一个对比表格:
| 特性维度 | pg_waldump (命令行工具) |
pg_walinspect (SQL 扩展) |
|---|---|---|
| 运行方式 | 独立的命令行工具,在操作系统层面执行 | PostgreSQL 扩展,通过 SQL 查询在数据库会话中执行 |
| 主要用途 | 调试、教育目的 | 调试、分析、报告、教育目的 |
| 核心优势 | 无需连接数据库 、灵活过滤、可实时跟踪 (-f) |
SQL集成 ,便于关联系统表 、结果可被进一步计算与聚合 |
| 访问控制 | 需服务器文件系统读取权限(通常是安装PostgreSQL的用户) | 需数据库内权限(默认超级用户 或**pg_read_server_files**角色成员) |
| 输出格式 | 固定的纯文本格式 | 结构化结果集(可像普通表一样查询、筛选、连接) |
🛠️ 使用 pg_waldump
pg_waldump 是一个在操作系统命令行中使用的工具,适合直接分析WAL文件。
-
基本命令格式:
bashpg_waldump [选项...] [起始段 [结束段]] -
常用选项:
选项 说明 -p <路径>指定 WAL 文件或包含 pg_wal子目录的路径-s <LSN>从指定的 LSN 开始读取 -e <LSN>在指定的 LSN 停止读取 -n <数量>限制显示的记录数量 -f实时跟踪模式,到达日志末尾后继续轮询新记录 -r <资源管理器>仅显示指定资源管理器的记录(如 Heap、Btree、Transaction),使用list查看所有--stats显示统计摘要而非详细记录 -
典型用法示例:
-
解析特定WAL段文件:
bashpg_waldump -p /var/lib/postgresql/data/pg_wal 0000000100001234000000AB这会将
0000000100001234000000AB这个WAL文件的内容以人类可读的形式输出。 -
从特定LSN开始并限制记录数:
bashpg_waldump -s 0/12345678 -n 5 -p /var/lib/postgresql/data/pg_wal这会从 LSN
0/12345678开始,只显示5条记录。 -
按资源管理器过滤并显示统计信息:
bashpg_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,非常适合与数据库系统表关联分析。
-
启用扩展 :
首先,需要在你要使用的数据库中创建扩展:
sqlCREATE 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记录的统计信息(默认按资源管理器分组) -
典型用法示例:
-
检查一段时间内的WAL记录:
sqlSELECT start_lsn, end_lsn, xid, resource_manager, record_type, description FROM pg_get_wal_records_info('0/156BA88', '0/156E768');这会返回指定LSN范围内的WAL记录,包含事务ID、资源管理器、记录类型等关键信息。
-
关联系统表,获取更详细的信息:
sqlSELECT 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)连接,以直接看到涉及的表名。 -
分析WAL体积分布:
sqlSELECT 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区间内,哪种类型的操作产生的日志量最大。
-
💡 重要提示和注意事项
- 权限是关键 :确保你以正确的权限运行这些工具。
pg_waldump需要访问数据库服务器文件系统,而pg_walinspect需要在数据库内有相应的权限。 - 服务器运行时解析 :官方文档提到,在服务器运行时使用
pg_waldump可能得到错误的结果。虽然在实际操作中(尤其是不繁忙的备库或轻载主库)常直接使用,但对于严格的生产环境分析,建议解析已归档的WAL文件或确保在安全的时机进行。 - 理解输出 :WAL记录包含大量底层信息。理解
resource_manager、record_type、description等字段的含义,需要一定的PostgreSQL内核知识。 - LSN的可用性 :使用
pg_walinspect的函数时,传入的LSN必须是服务器上可用的。