2010-06-14 28 views
5

我有一個LOB表空間。目前可用的12GB容量爲9GB。而且,據我所知,刪除記錄不會收回表空間中的任何存儲空間。 (這是通過監視存儲的簡單方法 - 針對user_extents的查詢,這是關於所有我被允許作爲非DBA的)我擔心處理進一步的處理。如何爲已刪除的LOB回收存儲空間

我的問題是空間不夠用 - 我們在12GB的表空間中大約有9GB空間,我想知道如何在請求更多空間之前回收空間。

LOB列存儲在一個單獨的表空間,雖然「存儲在行」允許小的。

這是Oracle 11.1,數據位於同一個表中的CLOB和BLOB列中。 LOB索引段(SYS_IL ...)很小,所有存儲都位於數據段(SYS_LOB ...)中

我們嘗試清除併合並,並且沒有得到任何位置 - 相同的字節數在user_extents中。

「Alter table xxx move」可以工作,但我們需要有一個地方將它移動到有足夠空間用於修改數據。當然,我們還需要在數小時內完成並重建索引,但這很簡單。

複製出良好的數據並進行截斷,然後將其複製回來也將起作用。但這幾乎就是「alter table」命令所做的。

我是否錯過了一些簡單的方法來收縮東西並重新獲得存儲空間?或者是「改變表xxx移動」的最佳方法?或者這是一個非問題,當需要時,Oracle會從刪除的lob行中取回空間?

+0

「這是所有我被允許作爲非DBA」 我沒法不注意到這一點,這是值得一說,並非每一個技術問題有技術答案。如果您是負責擔心這些事情的人,則應該授予您DBA權限或至少SELECT ANY DICTIONARY系統特權。如果你不是,你應該在影響其他用戶之前升級這樣的東西。 – durette 2016-11-16 17:07:12

回答

1

一般來說,一旦擴展分配給一個表,它就保持分配。如果將附加數據插入表中,則可以重新使用表中的空白空間。但是,很難從表格內回收空間,因爲表格可能具有(例如)塊1至100,並且空塊在塊50-75中,或空塊是1,3,5,7等

問題是,您是否擔心表中的空間被重複使用,或者您是否需要爲表空間中的其他對象釋放空間,或者您是否需要能夠縮小表空間數據文件?

6

這個問題很舊,但從來沒有一個工作的答案,並可能對很多人有用,所以在這裏我遇到這個問題時找到了解決方案。

你是對的,刪除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%'; 
+0

如果尚未啓用,則不要忘記啓用行移動:ALTER TABLE x_tab ENABLE ROW MOVEMENT; – durette 2016-11-16 17:11:34

相關問題