這個問題很舊,但從來沒有一個工作的答案,並可能對很多人有用,所以在這裏我遇到這個問題時找到了解決方案。
你是對的,刪除LOB將不會回收任何存儲在tablescape中。
運行此查詢之前和刪除LOB後會產生相同的結果
select bytes
from user_segments
where tablespace_name = yourTableSpace
and segment_name = yourTableName;
閱讀this甲骨文的文檔,我發現你需要執行下面的語句
ALTER TABLE yourLobTable MODIFY LOB (yourLobColumn) (SHRINK SPACE);
這將縮小一個BASICFILE
LOB段。
現在,如果你重新執行查詢
select bytes
from user_segments
where tablespace_name = yourTableSpace
and segment_name = yourTableName;
你會發現空間已被釋放到表空間,並能夠爲你想重新使用空間。
現在對於那些想釋放磁盤空間的人來說,請注意數據文件不會自動重新調整大小,並且仍然會保持磁盤上的完整大小。
但在此之前調整大小的數據文件,使用這些查詢,確保你在一個段解除分配未使用的空間(從同一個文檔偷走了如前所述)(使用一個你需要的)
ALTER TABLE table DEALLOCATE UNUSED KEEP integer;
ALTER INDEX index DEALLOCATE UNUSED KEEP integer;
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer;
注KEEP
子句是可選的,並允許您指定段中保留的空間量。您可以通過檢查DBA_FREE_SPACE
視圖來驗證釋放的空間是否已釋放。
現在重新大小的數據文件,
ALTER DATABASE DATAFILE yourDatafile.dbf resize 500M
注意,最大尺寸調整是基於數據的數據文件的最後一個塊的位置時,你可以縮小。因此,刪除大量數據後,您很難有機會重新調整大小。然後,最簡單的方法是導出數據並在另一個表空間中重新導入,然後刪除舊的表空間。在導入數據時,Oracle會盡可能地打包它們。
如果你想釋放更多的空間,你可以清空臨時表空間,這有時候會佔用很大的空間(我的數據庫爲5GB)。使用下面的語句來檢查它的大小:
SELECT tablespace_name, file_name, bytes
FROM dba_temp_files WHERE tablespace_name like 'TEMP%';
「這是所有我被允許作爲非DBA」 我沒法不注意到這一點,這是值得一說,並非每一個技術問題有技術答案。如果您是負責擔心這些事情的人,則應該授予您DBA權限或至少SELECT ANY DICTIONARY系統特權。如果你不是,你應該在影響其他用戶之前升級這樣的東西。 – durette 2016-11-16 17:07:12