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