从Postgresql获取磁盘空间

我有一个数据库在Linux服务器上有大量的数据。 由于更新和删除操作,它消耗了我硬盘中的大部分。 主要原因是我们使用的版本(8.1)没有定期的自动过程。 为了解决这个问题,我已经把真空放在特定的表格上,真空指令运行超过15个小时,并继续运行。 所以我刚刚停止真空执行,因为其他进程无法访问该表15小时。

有什么办法可以克服这个问题,回收内存而不影响其他进程。

谢谢

版本8.1是截至2010年11月的生命周期结束。您需要升级到8.3或更高版本的较新版本。 版本8.2也将在几个月内成为EOL。

真空满需要一个表锁,是否获得锁或是只是等待15个小时才能得到它? VACUUM FULL是回收磁盘空间的唯一方法。

版本8.1确实有auto_vacuum ,它是在这个版本中引入的:

从PostgreSQL 8.1开始,有一个单独的可选服务器进程叫做autovacuum守护进程,其目的是自动执行VACUUM和ANALYZE命令。

打开它,或在一个时间间隔内手动执行VACUUM(没有FULL)。

你可以试试CLUSTER ( doc here ) – 它会重写和压缩一个完整的表格。 当VACUUM FULL做到这一点CLUSTER通过写入第二个文件来完成工作,并在作业之后切换文件。

这有一些优点和缺点:

  • 它比VACUUM FULL快得多,
  • 运行时需要更多的存储空间(第二个表文件),
  • 它需要在表上有一个EXCLUSIVE锁。

你可以从几张小桌子开始感受一下。

请查阅PostgreSQL邮件列表以了解更多细节。

如果VACUUM债务真的很大,那么从pg_dump备份恢复也是一个select。 这暂时接近升级到8.4或更高。