无需停机即可从已删除的列中回收磁盘空间

vib*_*blo 9 postgresql disk-space ddl vacuum postgresql-9.3

我在 PostgreSQL 数据库中有一个大量使用的表(大约有 500 万行),我想在其中删除一列并回收该列使用的空间。

文档建议进行表重写ALTER TABLE以强制返回空间,但这在使用表时运行并不安全,并且会导致停机。是否有任何不需要停机的实用选项?我试图运行该pgcompact工具,但这并没有改变任何东西。

Erw*_*ter 12

ALTER TABLE .. DROP COLUMN ...在系统表中将该列标记为已删除pg_attribute。在以某种方式重写行之前,不会以其他方式操纵表本身。下降本身非常快,但确实需要短暂ACCESS EXCLUSIVE锁定。不过,我不会称之为“停机时间”。

实际上回收磁盘空间是棘手的部分。您可以使用社区工具pg_repack代替VACUUM FULLor CLUSTER(以独占方式锁定表)。它避免了排他锁,但它需要磁盘上的可用空间才能操作。更多细节:

或者,如果您的表中的行最终更新,您可以等待它。每个新行版本都将删除的列设置为 NULL。当旧行版本被您覆盖或删除时,VACUUM您基本上会重新获得空间。但是,一些极端情况例外适用。看: