删除行并获取postgresql空间

时间:2017-12-16 12:33:43

标签: sql postgresql autovacuum

我对postgresql没有经验。

做了一个简单的命令
DELETE FROM table_name where some_condition;

涉及数千行。但实际上在那个命令之后,磁盘空间变小了。

任何想法出了什么问题?我enavaled autovacuum = on并且还尝试执行'VACUUM FULL;'但这耗费了我的整个磁盘空间。

我想要做的很简单。删除行并获取空间。涉及到很多空间,机器上没有太多空间。有办法吗?

2 个答案:

答案 0 :(得分:2)

除非您确切知道自己在做什么,否则

autovacuum应该在任何现代Postgres数据库中运行。但是autovacuum 会缩小表,除了罕见的极端情况。它会计划定期VACUUMANALYZE个作业,但永远不会 VACUUM FULL,它会对已处理的表和索引获取排他锁。 VACUUM有助于避免表和索引膨胀,但是,通过清理死元组(以及各种其他好的行为),从而使空间可用于将来对同一对象的写操作 - 而不是向操作系统返回空间,

你写道:

  

尝试执行'VACUUM FULL;'但这耗费了我的整个磁盘空间。

您的意思是 暂时 ?因为那是VACUUM FULL所做的。但是当它完成后,表和相关索引将减少到最小大小 - 这通常是不可取的,除非您迫切需要磁盘空间或行永远不会更新。

所以VACUUM FULL 适合您的工具,除非您已经没有磁盘空间 - 最好不要开始使用。所以你需要创造一些摆动空间让它发挥其魔力。

还有社区工具 pg_repack ,它可以与没有排他锁的VACUUM FULL相同。但它还需要一些可用的磁盘空间才能工作。相关答案详情如下:

要删除表的所有行并立即释放磁盘空间,请使用TRUNCATE。它有效地在磁盘上写入一个新文件并删除旧文件。这也是它通常不能与DB上的并发加载一起使用的原因。

TRUNCATE table_name;

答案 1 :(得分:1)

VACUUM FULL的工作原理是创建每个表的新版本并复制所有数据。在新表完成之前,不会删除旧表,因此VACUUM FULL操作将在处理时暂时增加磁盘空间。请参阅PostgreSQL文档中的this note(强调我的):

  

提示:当一个表由于大量更新或删除活动而包含大量死行版本时,普通VACUUM可能不会令人满意。如果您有这样的表并且需要回收它占用的多余磁盘空间,则需要使用VACUUM FULL,或者使用CLUSTER或ALTER TABLE的表重写变体之一。这些命令重写表的全新副本并为其构建新索引。所有这些选项都需要独占锁定。 请注意,它们还临时使用大约等于表大小的额外磁盘空间,因为表和索引的旧副本无法释放,直到新的完成。

另一方面,常规VACUUM只修剪从数据库文件中删除的行和索引条目。

如果您首先运行常规VACUUM,然后尝试运行VACUUM FULL,则可能会取得更大成功。如果您尝试在特定表上运行VACUUM FULL,您可能还会获得更多成功。如果以正确的顺序运行它们,则可能能够恢复足够的磁盘空间,以使数据库中的其余表可以运行VACUUM FULL。否则,您需要找到一些增加可用磁盘空间的方法,以便VACUUM FULL可以完成。