PostgreSQL执行ROLLBACK后存储空间未回收的原因咨询
PostgreSQL回滚后存储空间未回收的原因
MVCC机制的设计特性:PostgreSQL靠多版本并发控制(MVCC)实现读写并发,执行
UPDATE时不会直接修改原行,而是标记原行为"删除状态"并插入新行版本。即便执行ROLLBACK撤销更新,新生成的行版本会被清理,但原数据文件的空间不会立刻归还给操作系统——这些空间会被PostgreSQL标记为表内空闲空间,供后续INSERT/UPDATE操作复用,避免频繁向操作系统申请、释放空间带来的性能损耗。PostgreSQL不会主动收缩数据文件:默认的
VACUUM操作只会清理无效行版本、更新空闲空间映射,不会把空闲空间还给操作系统。只有执行VACUUM FULL、CLUSTER或者ALTER TABLE ... REINDEX这类重写整个表的操作,才会把未使用的空间释放给操作系统,但这类操作会锁表,需要谨慎执行。RDS存储的预分配与延迟释放:AWS RDS的存储层会预分配部分空间提升性能,即便PostgreSQL内部标记了空闲空间,RDS也不会立刻回收这部分空间并调整计费额度,通常要等PostgreSQL主动释放(比如执行上述重写表的操作)后,RDS才会逐步回收存储空间。
WAL日志的残留占用:执行
UPDATE过程中会生成预写日志(WAL)保证数据一致性,即便回滚,已写入的WAL日志要等检查点(checkpoint)完成后才会被清理,这部分日志在清理前会持续占用存储空间。
内容的提问来源于stack exchange,提问作者Zach Anton
相关产品推荐
相关产品推荐

