我有一个数据库在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快得多, 你可以从几张小桌子开始感受一下。
请查阅PostgreSQL邮件列表以了解更多细节。
如果VACUUM债务真的很大,那么从pg_dump备份恢复也是一个select。 这暂时接近升级到8.4或更高。