回滚事务是否写入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
相关产品推荐
相关产品推荐

