You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

回滚事务是否写入PostgreSQL WAL?复制槽异常增大咨询

PostgreSQL复制槽与回滚事务WAL问题解答

问题描述

我拥有一个PostgreSQL复制槽,回滚若干事务后,该复制槽的大小急剧增长,但其中并未包含任何槽变更信息。请问已回滚的事务是否仍存在于WAL中,却无法通过以下命令查询到?

SELECT * FROM pg_logical_slot_peek_changes
              ('test_slot', NULL, NULL, 'include-xids', '1','include-timestamp','1');

解答

  • 已回滚的事务确实会残留在WAL中,但无法通过pg_logical_slot_peek_changes这类逻辑解码命令查询到。
  • 具体原因:
    • PostgreSQL采用预写式日志(WAL)架构,回滚操作本身会写入WAL,且回滚前的事务操作日志也不会被立刻清理。
    • 逻辑复制槽的核心机制是保留所有未被该槽确认处理的WAL段,不管对应事务最终是提交还是回滚。所以回滚事务产生的WAL会被复制槽强制保留,直接导致槽关联的WAL占用空间暴涨。
    • 但pg_logical_slot_peek_changes只输出已提交事务的变更记录——逻辑解码的目标是捕获数据库的持久化状态变更,回滚的事务没有对数据库产生持久影响,自然不会出现在查询结果里。
  • 验证方法:你可以查询pg_replication_slots视图的restart_lsn字段,对比回滚前后的LSN数值变化,就能确认复制槽保留的WAL范围确实包含了回滚事务的日志区间,但这些内容不会被逻辑解码返回。

内容的提问来源于stack exchange,提问作者Adrij Shikhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:38:23