Postgresql

刪除後如何在不重建表的情況下回收磁碟空間?

  • April 19, 2019

我們的 PostgreSQL 9.0 Windows 生產伺服器空間不足。

在我們 100GB 的數據庫中,我們有一個包含 TOASTed 二進制數據的大表。我們已經刪除了一些行,需要將空間返回給 O/S。

我們沒有足夠的空間來完全重寫表,而我所有的閱讀,CLUSTER都是他們需要重寫的表。到目前為止,我的 google-fu 還不足以找到其他任何東西。VACUUM FULL``pg_repack

一些停機時間是可以接受的(約 2 小時),但是備份/恢復對於我們的目的來說太慢了,我也不熱衷於在步驟之間刪除數據庫。

問題:如何在不進行全表重寫的情況下將磁碟空間歸還給作業系統?

(這是一個生產伺服器,因此任何解決方案都必須是有信譽的/推薦的/支持的等)。

(PS 如果可以以某種方式在其上重建表,則可以使用單獨的更大的磁碟。表空間?)

如果您使用除CLUSTER//VACUUM FULL之外的任何東西pg_repack(所有這些都自動管理鎖),您需要確保沒有並發寫入表。在表上獲取排他鎖並在單個事務中完成所有操作,或者更好的是,關閉所有連接以避免並發更改。

TABLESPACE

是的,你的最後一個想法可行。在另一個磁碟上創建一個新的表空間。

CREATE TABLESPACE ts1 LOCATION '/data/disk2';

然後在新表空間中創建表的優化副本:

CREATE TABLE new_tbl 
TABLESPACE ts1 AS
SELECT * FROM tbl
ORDER BY ....  -- ORDER BY is optional 

副本將被緊緊地打包,沒有死行。

然後你可能只是刪除舊表並重命名新表以繼續使用新磁碟。

或者,如果由於某種原因必須將其保留在舊磁碟上,請刪除舊表,重命名新表並將其移回預設表空間。現在,這一步快得多:

ALTER TABLE tbl SET TABLESPACE pg_default

根據文件:

此表單將表的表空間更改為指定的表空間,並將與表關聯的數據文件移動到新的表空間。表上的索引(如果有)不會移動;但可以使用其他SET TABLESPACE命令單獨移動它們。另請參閱 CREATE TABLESPACE

無論哪種方式,不要忘記(重新)創建所有依賴對象。索引、外鍵、視圖……

好吧,您可以ALTER TABLE tbl SET TABLESPACE ...開始使用,但是表格不會按要求進行優化,只是按原樣移動。但是您將有足夠的迴旋餘地來執行 pg_repack 等。

COPY

完整的備份/恢復可能需要很長時間,但您可以只對有問題的表執行此操作。

COPY tbl TO '/path/to/other/disk/tbl.pgsql';
TRUNCATE tbl;
COPY tbl FROM '/path/to/other/disk/tbl.pgsql';

桌子現在已經擠得滿滿噹噹了。

臨時表

如果您碰巧有足夠的 RAM,您可以對 RAM 中的臨時表執行類似的操作。會快很多。詳細說明:

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