我在具有有限驱动器空间的嵌入式系统上使用PostgreSQL。现在DB驱动器已满。当我删除数据时,它似乎没有释放任何空间。我试图VACUUM FULL,但这需要空间。删除最后剩下的索引也是如此。
关于如何在不随意删除内容的情况下释放空间的任何想法?我可以承受从后面丢失一些数据,但我似乎无法真正做到这一点,因为没有足够的空间来充实VACUUM。
答案 0 :(得分:1)
PostgreSQL
使用MVCC
模型,这意味着已删除的记录将其空间标记为空闲(在已删除它们的事务已提交之后),但仍保留在表中。
在PostgreSQL 9.0
之前,VACUUM FULL
用于在表格内移动数据而无需额外的空间。
在PostgreSQL 9.0
中,VACUUM FULL
的行为发生了变化,现在需要额外的空间来存放该表的完整副本。
您可以尝试从表中删除索引并从最少的一个开始逐个抽真空。
答案 1 :(得分:0)
此时最简单的答案是将数据库转储到其他驱动器/计算机(例如,使用pg_dump
或pg_dumpall
如果您有多个数据库,请记住像大对象那样需要特殊备份/恢复过程的东西然后删除并重新创建数据库。
如果剩下一点点空间,你可以尝试vacuum full smallesttable
,它可以完成并释放一些空间来吸尘下一个最小的桌子,依此类推。
如果您最终完全填满驱动器,数据库服务器可能会拒绝启动,您将无法执行其中任何一项操作。在这种情况下,您可以将整个数据目录移动到具有相同CPU架构和更多磁盘空间的另一台计算机,然后在那里启动postgresql以执行真空。
答案 2 :(得分:0)
在某些情况下,VACUUM(未满)可以回收一些磁盘空间。 (我认为它将返回完全死于操作系统的页面。)这可能会释放足够的空间以开始使用VACUUM。但让一个表增长到超过磁盘可用空间量并不是一个好主意。