postgresql 的WAL日志解析工具 pg_waldump

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: postgresql 的WAL日志解析工具 pg_waldump

基本使用

root@fe82b689f575:/var/lib/postgresql/data/pg_wal# pg_waldump --help
pg_waldump decodes and displays PostgreSQL write-ahead logs for debugging.

Usage:
  pg_waldump [OPTION]... [STARTSEG [ENDSEG]]

Options:
  -b, --bkp-details      output detailed information about backup blocks 
  -e, --end=RECPTR       stop reading at WAL location RECPTR 
  -f, --follow           keep retrying after reaching end of WAL
  -n, --limit=N          number of records to display
  -p, --path=PATH        directory in which to find log segment files or a
                         directory with a ./pg_wal that contains such files
                         (default: current directory, ./pg_wal, $PGDATA/pg_wal)
  -q, --quiet            do not print any output, except for errors
  -r, --rmgr=RMGR        only show records generated by resource manager RMGR;
                         use --rmgr=list to list valid resource manager names
  -s, --start=RECPTR     start reading at WAL location RECPTR
  -t, --timeline=TLI     timeline from which to read log records
                         (default: 1 or the value used in STARTSEG)
  -V, --version          output version information, then exit
  -x, --xid=XID          only show records with transaction ID XID
  -z, --stats[=record]   show statistics instead of records
                         (optionally, show per-record statistics)
  -?, --help             show this help, then exit

Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>

中文翻译

STARTSEG    从指定的日志段文件开始读取。这也隐含地决定了要搜索文件的路径以及 要使用的时间线。
ENDSEG      在读取指定的日志段文件后停止。
Options:
  -b, --bkp-details      输出有关备份块的细节。
  -e, --end=RECPTR       在指定的日志位置停止读取,而不是一直读取到日志流的末尾。
  -f, --follow           在到达可用 WAL 的末尾之后,保持每秒轮询一次是否有新的 WAL 出现。
  -n, --limit=N          显示指定数量的记录,然后停止。
  -p, --path=PATH        要在哪个目录中寻找日志段文件。默认是在当前目录的pg_xlog 子目录中搜索。
  -r, --rmgr=RMGR        只显示由指定资源管理器生成的记录。如果把list作为资源管理器名称 传递给这个选项,则打印出可用资源管理器名称的列表然后退出。
  -s, --start=RECPTR     要从哪个日志位置开始读取。默认是从找到的最早的文件的第一个可用日志记录开始。
  -t, --timeline=TLI     要从哪个时间线读取日志记录。默认是使用startseg(如果指定) 中的值,否则默认为 1
  -V, --version          打印pg_xlogdump版本并且退出。
  -x, --xid=XID         只显示用给定事务 ID 标记的记录。
  -z, --stats[=record]   显示概括统计信息(记录的数量和尺寸以及全页镜像)而不是显示 每个记录。可以选择针对每个记录生成统计信息,而不是针对每个 资源管理器生成。
  -?, --help             show this help, then exit

实践

展示 wal 中所有的资源管理名称

root@fe82b689f575:/var/lib/postgresql/data/pg_wal# pg_waldump --rmgr=list
XLOG
Transaction
Storage
CLOG
Database
Tablespace
MultiXact
RelMap
Standby
Heap2
Heap
Btree
Hash
Gin
Gist
Sequence
SPGist
BRIN
CommitTs
ReplicationOrigin
Generic
LogicalMessage

展示 STARTSEG 到 ENDSEG 的事务日志

root@fe82b689f575:/var/lib/postgresql/data/pg_wal# ls
000000010000000000000013  000000010000000000000014  000000010000000000000015  000000010000000000000016  000000010000000000000017  archive_status

root@fe82b689f575:/var/lib/postgresql/data/pg_wal# pg_waldump 000000010000000000000013 000000010000000000000017
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000028, prev 0/12011720, desc: RUNNING_XACTS nextXid 748 latestCompletedXid 747 oldestRunningXid 748
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000060, prev 0/13000028, desc: RUNNING_XACTS nextXid 748 latestCompletedXid 747 oldestRunningXid 748
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/13000098, prev 0/13000060, desc: CHECKPOINT_ONLINE redo 0/13000060; tli 1; prev tli 1; fpw true; xid 0:748; oid 24582; multi 1; offset 0; oldest xid 479 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 748; online
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000110, prev 0/13000098, desc: RUNNING_XACTS nextXid 748 latestCompletedXid 747 oldestRunningXid 748
rmgr: Heap        len (rec/tot):     54/   150, tx:        748, lsn: 0/13000148, prev 0/13000110, desc: INSERT off 2 flags 0x00, blkref #0: rel 1663/16393/16536 blk 0 FPW
rmgr: Transaction len (rec/tot):     34/    34, tx:        748, lsn: 0/130001E0, prev 0/13000148, desc: COMMIT 2021-12-09 08:52:27.138352 UTC
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000208, prev 0/130001E0, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000240, prev 0/13000208, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/13000278, prev 0/13000240, desc: CHECKPOINT_ONLINE redo 0/13000240; tli 1; prev tli 1; fpw true; xid 0:749; oid 24582; multi 1; offset 0; oldest xid 479 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 749; online
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/130002F0, prev 0/13000278, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: Heap        len (rec/tot):     54/   186, tx:        749, lsn: 0/13000328, prev 0/130002F0, desc: INSERT off 3 flags 0x00, blkref #0: rel 1663/16393/16536 blk 0 FPW
rmgr: Transaction len (rec/tot):     34/    34, tx:        749, lsn: 0/130003E8, prev 0/13000328, desc: COMMIT 2021-12-09 08:56:54.988836 UTC
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000410, prev 0/130003E8, desc: RUNNING_XACTS nextXid 750 latestCompletedXid 749 oldestRunningXid 750
rmgr: Heap        len (rec/tot):     54/    54, tx:        750, lsn: 0/13000448, prev 0/13000410, desc: DELETE off 1 flags 0x00 KEYS_UPDATED , blkref #0: rel 1663/16393/16536 blk 0
rmgr: Heap        len (rec/tot):     54/    54, tx:        750, lsn: 0/13000480, prev 0/13000448, desc: DELETE off 2 flags 0x00 KEYS_UPDATED , blkref #0: rel 1663/16393/16536 blk 0
rmgr: Transaction len (rec/tot):     34/    34, tx:        750, lsn: 0/130004B8, prev 0/13000480, desc: COMMIT 2021-12-09 08:58:08.529192 UTC
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/130004E0, prev 0/130004B8, desc: RUNNING_XACTS nextXid 751 latestCompletedXid 750 oldestRunningXid 751
rmgr: Heap        len (rec/tot):     70/    70, tx:        751, lsn: 0/13000518, prev 0/130004E0, desc: HOT_UPDATE off 3 xmax 751 flags 0x00 ; new off 4 xmax 0, blkref #0: rel 1663/16393/16536 blk 0
rmgr: Transaction len (rec/tot):     34/    34, tx:        751, lsn: 0/13000560, prev 0/13000518, desc: COMMIT 2021-12-09 09:00:55.140021 UTC
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000588, prev 0/13000560, desc: RUNNING_XACTS nextXid 752 latestCompletedXid 751 oldestRunningXid 752
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/130005C0, prev 0/13000588, desc: RUNNING_XACTS nextXid 752 latestCompletedXid 751 oldestRunningXid 752
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/130005F8, prev 0/130005C0, desc: CHECKPOINT_ONLINE redo 0/130005C0; tli 1; prev tli 1; fpw true; xid 0:752; oid 24582; multi 1; offset 0; oldest xid 479 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 752; online
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000670, prev 0/130005F8, desc: RUNNING_XACTS nextXid 752 latestCompletedXid 751 oldestRunningXid 752
pg_waldump: fatal: error in WAL record at 0/13000670: invalid record length at 0/130006A8: wanted 24, got 0

日志参数介绍

rmgr : 资源名称
lsn: 0/0162D3F0 日志编号
prev 0/0162D3B8
desc : 对日志详细信息的描述
xid 事务id

postgresql之根据lsn 获取 wal文件名

select pg_current_wal_lsn(),
pg_walfile_name(pg_current_wal_lsn()),
pg_walfile_name_offset(pg_current_wal_lsn());

在这里插入图片描述

插入,删除,修改数据操作的日志

wal 日志会先进入资源等待 rmgr: Standby ,分配一个事务id 748,进入rmgr: Heap,把插入事务写入到指定日志偏移位置 desc: INSERT off 2,分配下一事务id

root@fe82b689f575:/var/lib/postgresql/data/pg_wal# pg_waldump 000000010000000000000013
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000028, prev 0/12011720, desc: RUNNING_XACTS nextXid 748 latestCompletedXid 747 oldestRunningXid 748
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000060, prev 0/13000028, desc: RUNNING_XACTS nextXid 748 latestCompletedXid 747 oldestRunningXid 748
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/13000098, prev 0/13000060, desc: CHECKPOINT_ONLINE redo 0/13000060; tli 1; prev tli 1; fpw true; xid 0:748; oid 24582; multi 1; offset 0; oldest xid 479 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 748; online


## 插入数据
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000110, prev 0/13000098, desc: RUNNING_XACTS nextXid 748 latestCompletedXid 747 oldestRunningXid 748
rmgr: Heap        len (rec/tot):     54/   150, tx:        748, lsn: 0/13000148, prev 0/13000110, desc: INSERT off 2 flags 0x00, blkref #0: rel 1663/16393/16536 blk 0 FPW
rmgr: Transaction len (rec/tot):     34/    34, tx:        748, lsn: 0/130001E0, prev 0/13000148, desc: COMMIT 2021-12-09 08:52:27.138352 UTC


rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000208, prev 0/130001E0, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749


rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000240, prev 0/13000208, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/13000278, prev 0/13000240, desc: CHECKPOINT_ONLINE redo 0/13000240; tli 1; prev tli 1; fpw true; xid 0:749; oid 24582; multi 1; offset 0; oldest xid 479 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 749; online

## 插入数据
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/130002F0, prev 0/13000278, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: Heap        len (rec/tot):     54/   186, tx:        749, lsn: 0/13000328, prev 0/130002F0, desc: INSERT off 3 flags 0x00, blkref #0: rel 1663/16393/16536 blk 0 FPW
rmgr: Transaction len (rec/tot):     34/    34, tx:        749, lsn: 0/130003E8, prev 0/13000328, desc: COMMIT 2021-12-09 08:56:54.988836 UTC


## 删除数据(此处删除了两条)
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000410, prev 0/130003E8, desc: RUNNING_XACTS nextXid 750 latestCompletedXid 749 oldestRunningXid 750
rmgr: Heap        len (rec/tot):     54/    54, tx:        750, lsn: 0/13000448, prev 0/13000410, desc: DELETE off 1 flags 0x00 KEYS_UPDATED , blkref #0: rel 1663/16393/16536 blk 0
rmgr: Heap        len (rec/tot):     54/    54, tx:        750, lsn: 0/13000480, prev 0/13000448, desc: DELETE off 2 flags 0x00 KEYS_UPDATED , blkref #0: rel 1663/16393/16536 blk 0
rmgr: Transaction len (rec/tot):     34/    34, tx:        750, lsn: 0/130004B8, prev 0/13000480, desc: COMMIT 2021-12-09 08:58:08.529192 UTC

## 更新数据
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/130004E0, prev 0/130004B8, desc: RUNNING_XACTS nextXid 751 latestCompletedXid 750 oldestRunningXid 751
rmgr: Heap        len (rec/tot):     70/    70, tx:        751, lsn: 0/13000518, prev 0/130004E0, desc: HOT_UPDATE off 3 xmax 751 flags 0x00 ; new off 4 xmax 0, blkref #0: rel 1663/16393/16536 blk 0
rmgr: Transaction len (rec/tot):     34/    34, tx:        751, lsn: 0/13000560, prev 0/13000518, desc: COMMIT 2021-12-09 09:00:55.140021 UTC
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/13000588, prev 0/13000560, desc: RUNNING_XACTS nextXid 752 latestCompletedXid 751 oldestRunningXid 752
pg_waldump: fatal: error in WAL record at 0/13000588: invalid record length at 0/130005C0: wanted 24, got 0

查看事务日志

root@fe82b689f575:/var/lib/postgresql/data/pg_wal# pg_waldump  -b -f  -r Transaction 000000010000000000000013
rmgr: Transaction len (rec/tot):     34/    34, tx:        748, lsn: 0/130001E0, prev 0/13000148, desc: COMMIT 2021-12-09 08:52:27.138352 UTC
rmgr: Transaction len (rec/tot):     34/    34, tx:        749, lsn: 0/130003E8, prev 0/13000328, desc: COMMIT 2021-12-09 08:56:54.988836 UTC
rmgr: Transaction len (rec/tot):     34/    34, tx:        750, lsn: 0/130004B8, prev 0/13000480, desc: COMMIT 2021-12-09 08:58:08.529192 UTC
rmgr: Transaction len (rec/tot):     34/    34, tx:        751, lsn: 0/13000560, prev 0/13000518, desc: COMMIT 2021-12-09 09:00:55.140021 UTC

^C
root@fe82b689f575:/var/lib/postgresql/data/pg_wal# pg_waldump  -b -f  -r Transaction 000000010000000000000013 000000010000000000000017
rmgr: Transaction len (rec/tot):     34/    34, tx:        748, lsn: 0/130001E0, prev 0/13000148, desc: COMMIT 2021-12-09 08:52:27.138352 UTC
rmgr: Transaction len (rec/tot):     34/    34, tx:        749, lsn: 0/130003E8, prev 0/13000328, desc: COMMIT 2021-12-09 08:56:54.988836 UTC
rmgr: Transaction len (rec/tot):     34/    34, tx:        750, lsn: 0/130004B8, prev 0/13000480, desc: COMMIT 2021-12-09 08:58:08.529192 UTC
rmgr: Transaction len (rec/tot):     34/    34, tx:        751, lsn: 0/13000560, prev 0/13000518, desc: COMMIT 2021-12-09 09:00:55.140021 UTC

^C

相关文章
|
7月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
1652 1
|
3月前
|
运维 安全 数据可视化
日志审查安排工具实战攻略:中小团队如何通过日志审查安排工具建立可控、安全的审查机制?
在审计敏感时代,日志审查安排工具成为安全运维与合规管理的关键利器。它实现审查任务的流程化、周期化与可视化,支持多系统协作、责任到人,确保“可控、可查、可追”的日志治理。工具如板栗看板、Asana、Monday 等提供任务调度、问题闭环与合规对接能力,助力企业构建高效、透明的日志审查体系,提升安全与合规水平。
|
4月前
|
JavaScript API 开发工具
HarmonyOS NEXT实战:日志工具
本文介绍了在HarmonyOS Next应用开发中,如何封装一个简单易用的日志工具LoggerKit。通过使用系统提供的HiLog API,开发者可以灵活输出不同级别的日志信息(DEBUG、INFO、WARN、ERROR、FATAL),用于分析应用运行状态和调试逻辑问题。文章详细说明了日志级别、参数配置及使用注意事项,并提供了完整的TypeScript封装示例代码,便于实际项目集成与应用调试。
102 0
|
7月前
|
机器学习/深度学习 人工智能 JSON
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
Resume Matcher 是一款开源AI简历优化工具,通过解析简历和职位描述,提取关键词并计算文本相似性,帮助求职者优化简历内容,提升通过自动化筛选系统(ATS)的概率,增加面试机会。
643 18
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
|
6月前
|
存储 人工智能 API
离线VS强制登录?Apipost与Apifox的API工具理念差异深度解析
在代码开发中,工具是助手还是枷锁?本文通过对比Apipost和Apifox在断网环境下的表现,探讨API工具的选择对开发自由度的影响。Apifox强制登录限制了离线使用,而Apipost支持游客模式与本地存储,尊重开发者数据主权。文章从登录策略、离线能力、协作模式等方面深入分析,揭示工具背后的设计理念与行业趋势,帮助开发者明智选择,掌握数据控制权并提升工作效率。
|
6月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
7月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
548 13
|
7月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
8月前
|
数据采集 存储 调度
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
在Python网页抓取领域,BeautifulSoup和Scrapy是两款备受推崇的工具。BeautifulSoup易于上手、灵活性高,适合初学者和简单任务;Scrapy则是一个高效的爬虫框架,内置请求调度、数据存储等功能,适合大规模数据抓取和复杂逻辑处理。两者结合使用可以发挥各自优势,例如用Scrapy进行请求调度,用BeautifulSoup解析HTML。示例代码展示了如何在Scrapy中设置代理IP、User-Agent和Cookies,并使用BeautifulSoup解析响应内容。选择工具应根据项目需求,简单任务选BeautifulSoup,复杂任务选Scrapy。
155 1
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
|
7月前
|
数据可视化 测试技术 API
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离开发中,API调试至关重要。本文探讨有无调试工具时如何高效调试API,重点分析Postman、Swagger等工具优势及无工具代码调试方法。通过实际场景如用户登录接口,对比两者特性。同时介绍Apipost-Hepler(IDEA插件),将可视化与代码调试结合,提供全局请求头配置、历史记录保存等功能,优化团队协作与开发效率,助力API调试进入全新阶段。

热门文章

最新文章

推荐镜像

更多