Postgresql
從刪除的列中回收磁碟空間而無需停機
我在 PostgreSQL 數據庫中有一個頻繁使用的表(大約 500 萬行),我想在其中刪除一列並回收該列使用的空間。
文件建議進行表重寫
ALTER TABLE
以強制退回空間,但在使用表時執行並不安全,並且會導致停機。是否有不需要任何停機時間的實用選項?我試圖執行該pgcompact
工具,但這並沒有改變任何東西。
ALTER TABLE .. DROP COLUMN ...
在系統表中將該列標記為已刪除pg_attribute
。在以某種方式重寫行之前,不會對錶本身進行其他操作。下降本身非常快,但確實需要短暫的ACCESS EXCLUSIVE
鎖定。不過,我不會稱其為“停機時間”。實際上回收磁碟空間是棘手的部分。您可以使用社區工具
pg_repack
代替VACUUM FULL
orCLUSTER
(專門鎖定表)。它避免了獨占鎖,但它需要磁碟上的可用空間來操作。更多細節:或者,如果您的表中的行最終更新,您可以等待它結束。每個新行版本都使用設置為 NULL 的刪除列寫入。當舊行版本被您覆蓋或刪除時,
VACUUM
您基本上會重新獲得空間。但是,一些極端情況例外適用。看: