PostgreSQL:DELETE不会释放内存

时间:2011-05-04 12:39:00

标签: postgresql diskspace vacuum

我在具有有限驱动器空间的嵌入式系统上使用PostgreSQL。现在DB驱动器已满。当我删除数据时,它似乎没有释放任何空间。我试图VACUUM FULL,但这需要空间。删除最后剩下的索引也是如此。

关于如何在不随意删除内容的情况下释放空间的任何想法?我可以承受从后面丢失一些数据,但我似乎无法真正做到这一点,因为没有足够的空间来充实VACUUM。

3 个答案:

答案 0 :(得分:1)

PostgreSQL使用MVCC模型,这意味着已删除的记录将其空间标记为空闲(在已删除它们的事务已提交之后),但仍保留在表中。

PostgreSQL 9.0之前,VACUUM FULL用于在表格内移动数据而无需额外的空间。

PostgreSQL 9.0中,VACUUM FULL的行为发生了变化,现在需要额外的空间来存放该表的完整副本。

您可以尝试从表中删除索引并从最少的一个开始逐个抽真空。

答案 1 :(得分:0)

此时最简单的答案是将数据库转储到其他驱动器/计算机(例如,使用pg_dumppg_dumpall如果您有多个数据库,请记住像大对象那样需要特殊备份/恢复过程的东西然后删除并重新创建数据库。

如果剩下一点点空间,你可以尝试vacuum full smallesttable,它可以完成并释放一些空间来吸尘下一个最小的桌子,依此类推。

如果您最终完全填满驱动器,数据库服务器可能会拒绝启动,您将无法执行其中任何一项操作。在这种情况下,您可以将整个数据目录移动到具有相同CPU架构和更多磁盘空间的另一台计算机,然后在那里启动postgresql以执行真空。

答案 2 :(得分:0)

在某些情况下,VACUUM(未满)可以回收一些磁盘空间。 (我认为它将返回完全死于操作系统的页面。)这可能会释放足够的空间以开始使用VACUUM。但让一个表增长到超过磁盘可用空间量并不是一个好主意。