Postgresql

從刪除的列中回收磁碟空間而無需停機

  • August 21, 2020

我在 PostgreSQL 數據庫中有一個頻繁使用的表(大約 500 萬行),我想在其中刪除一列並回收該列使用的空間。

文件建議進行表重寫ALTER TABLE以強制退回空間,但在使用表時執行並不安全,並且會導致停機。是否有不需要任何停機時間的實用選項?我試圖執行該pgcompact工具,但這並沒有改變任何東西。

ALTER TABLE .. DROP COLUMN ...在系統表中將該列標記為已刪除pg_attribute。在以某種方式重寫行之前,不會對錶本身進行其他操作。下降本身非常快,但確實需要短暫的ACCESS EXCLUSIVE鎖定。不過,我不會稱其為“停機時間”。

實際上回收磁碟空間是棘手的部分。您可以使用社區工具pg_repack代替VACUUM FULLor CLUSTER(專門鎖定表)。它避免了獨占鎖,但它需要磁碟上的可用空間來操作。更多細節:

或者,如果您的表中的行最終更新,您可以等待它結束。每個新行版本都使用設置為 NULL 的刪除列寫入。當舊行版本被您覆蓋或刪除時,VACUUM您基本上會重新獲得空間。但是,一些極端情況例外適用。看:

引用自:https://dba.stackexchange.com/questions/117510