Postgresql - 从500Gb DB / auto-vacuum大删除?

时间:2018-04-06 08:02:40

标签: postgresql vacuum autovacuum

我需要删除大约80%的500Gb Postgresql DB。 到目前为止,我已成功运行了大约50Gb行的删除命令,并在继续之前暂停。 (这花了很长时间,也许一个小时)

我注意到在删除大约50Gb的数据后,没有释放额外的磁盘空间,但是当我运行“htop”时,可以观察到一些内存密集的postgres进程。我是否正确假设这是死行,需要在释放磁盘空间之前将其抽真空?

这个问题的第二部分是,如果我没有弄错第一部分,我最好删除所有行然后允许自动真空发生吗?在我有机会继续我的行删除命令列表之前,它似乎已经启动了自动真空(或其他一些密集的后台进程)。我只是继续,还是应该优先告诉它先停止?

2 个答案:

答案 0 :(得分:3)

大删除后,autovacuum肯定会运行。这是设计的,不应该干扰你删除更多的行。

虽然autovacuum释放表中的死空间,但它不会将空间返回给操作系统。相反,它仍然是表中的自由空间,可以重复用于将来的插入。

如果要缩小表格,请对它们运行VACUUM (FULL),但要注意这会重写表格,因此它会暂时使用额外的存储空间并阻止所有并发活动。表

如果您必须定期进行批量删除,请考虑对表进行分区。它使批量删除无痛。

答案 1 :(得分:0)

更好的解决方案是TRUNCATE表。

在我的场景中,我删除了一个占用大量磁盘空间的特定行,但是VACUUM的数据太多,无法在合理的时间内清除。

我最终重复了该表:

CREATE table dupe_table AS (SELECT * FROM table);

截断原始表:

TRUNCATE table

最后将数据移回:<​​/ p>

INSERT INTO table(column1, column2, column3)
SELECT column1, column2, column3
FROM dupe_table

注意:如果您在创建重复表和截断原始表之间进行交易,则可以丢失数据