我在 Linux 服务器中有一个数据库,其中包含大量数据。由于更新和删除操作,它消耗了我硬盘上的大部分数据。主要原因是我们使用的版本 (8.1) 没有定期自动清理进程。为了解决这个问题,我将清理任务放到了特定的表中,清理命令运行了 15 个小时以上,并且一直在运行。所以我停止了清理任务的执行,因为其他进程在 15 小时内无法访问该表。
有什么方法可以解决这个问题并在不干扰其他进程的情况下恢复内存。
谢谢
答案1
版本 8.1 已于 2010 年 11 月停止使用。您需要升级到较新的版本,即 8.3 或更高版本。版本 8.2 也将在几个月内停止使用。
VACUUM FULL 需要表锁,它是否已获得锁,还是只是等待 15 小时才获得锁?VACUUM FULL 是回收磁盘空间的唯一方法。
8.1 版确实有自动清理,在此版本中引入了它:
从 PostgreSQL 8.1 开始,有一个单独的可选服务器进程,称为 autovacuum 守护进程,其目的是自动执行 VACUUM 和 ANALYZE 命令。
打开它,或者在一定时间间隔内手动执行 VACUUM(不带 FULL)。
答案2
你可以给予CLUSTER
(文档在这里)尝试一下 - 它将重写并压缩完整的表格。虽然VACUUM FULL
这样做到位,CLUSTER
通过写入第二个文件来完成其工作,并在作业之后切换文件。
这有一些优点和一些缺点:
- 它比 快得多
VACUUM FULL
, - 运行时需要更多存储空间(第二个表文件),
- 它需要对表进行排他锁。
您可以从几个较小的表开始来感受一下。
请查阅 PostgreSQL 邮件列表以获取更多详细信息。
答案3
如果 VACUUM 债务确实如此巨大,那么从 pg_dump 备份恢复也是一个选择。这暂时接近升级到 8.4 或更高版本。