刪除後如何在不重建表的情況下回收磁碟空間?
我們的 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 中的臨時表執行類似的操作。會快很多。詳細說明: