PostgreSQL 14.7中VACUUM无法回收空间问题求助
PostgreSQL Aurora 死行无法回收问题排查与解决
核心原因
AWS Aurora的只读副本会维护旧事务快照以提供一致性读,即便主库应用已关闭,副本的快照仍可能持有对旧行版本的引用,导致主库VACUUM无法清理这些死行。这是Aurora架构特有的机制,区别于普通PostgreSQL流复制。
验证方式
执行以下SQL查看副本的最旧事务ID:
SELECT oldest_xmin FROM pg_stat_replication;
对比主库当前事务ID:
SELECT txid_current();
若oldest_xmin远小于当前事务ID,说明副本持有旧快照,正是导致死行无法清理的原因。
解决步骤
- 临时调整副本架构:若业务允许,将只读副本提升为独立实例,断开与主库的复制关系。主库此时可正常执行VACUUM清理死行,完成后再重新搭建副本或调整副本数量。
- 检查副本同步延迟:通过AWS控制台查看只读副本的复制延迟指标,若延迟过高会导致快照无法及时更新,需排查副本性能或网络问题。
- 尝试VACUUM FULL(谨慎使用):在业务低峰期执行
VACUUM FULL staging.sd3;,该操作会直接重建表,绕过快照的行版本锁定,但会锁表且占用额外空间,需评估业务影响后操作。
原VACUUM输出
INFO: vacuuming "staging.sd3"
INFO: "seq": found 0 removable, 349255 nonremovable row versions in 31735 pages
DETAIL: 348974 dead row versions cannot be removed yet.
CPU: user: 0.75 s, system: 0.06 s, elapsed: 3.19 s.
内容的提问来源于stack exchange,提问作者user2238704
相关产品推荐
相关产品推荐

