2013-05-16 37 views
3

在我的系統中,永久數據與某些臨時數據(如日誌)是分開的。這是通過將日誌表(用戶定義的程序日誌,不要與系統日誌混淆)放在與主表不同的表空間中完成的。Oracle數據文件碎片整理

所以有兩個表空間MAINLOG。一個數據文件適用於每個表空間。兩個數據文件maxsize都設置爲4GB,它們的初始大小爲8MB,並且它們自動延伸到下一個8MB。

由於我使用oracle的express版本,我總共需要它們不超過4GB。

而且有時會發生,當我需要減少,以釋放部分空間用於必要的數據LOG數據文件的大小。

現在我這樣做是這樣的:

truncate table schema_name.log_table; 
alter database datafile '/path/to/the/log/datafile/log1.dbf' resize 128M; 

和它的作品,因爲truncate擺脫的在數據文件中的所有信息。

但是,如果我遇到一種情況,當我需要爲MAIN表空間釋放一些大小時會怎麼樣。我截斷幾個表有(或我才知道被用於一些操作有一個在數據文件的可用空間,它已分配但未被通過數據occupated,),現在需要以整理主表空間的數據文件,以減少它的大小。沒有碎片整理我得到一個異常:

ORA-03297: file contains used data beyond requested RESIZE value 

所以我能夠對數據文件莫名其妙地執行碎片整理操作?

+0

參見https://oracle-base.com/articles/misc/reclaiming-unused-space和[碎片整理表空間@ asktom](https://asktom.oracle.com/pls/asktom/f%3Fp%3D100 :11:0 :::: p11_question_id:7149039425561)。 – Vadzim

回答

5

基本上有三層空間分配需要考慮。

  1. 表和索引段中的行使用的空間。刪除行通常足以釋放該段中新數據的空間,但這不會釋放該段在數據文件中佔用的空間。

  2. 段的數據文件佔用的空間。截斷表格會默認收縮片段,或者如果片段中有大量可用空間,則可以移動表格和/或重建索引。這也將改變數據文件的段,這可能是相關的位置...

  3. 空間數據文件使用的存儲。收縮文件是可能的,但文件中的段的位置是至關重要的。你只能收縮到最後一段的末尾。如果您有時間和資源,可以將該段移動/重建到不同的表空間,然後縮小數據文件並將其重新移回/重建。

這(3)是你面對的問題。完整的移動和重建不是唯一的選擇......您可以導出所有內容或嘗試移動/重建數據文件末尾的段,但這更復雜。如果可以的話,避免它。

+0

這裏至關重要的事實是,XE中DB的最大大小是爲數據文件分配的空間(第三點)。這就是爲什麼截斷表或刪除其中的行/索引是不可接受的。重新創建一些段 - 我沒有想到 - 我可以指望新的表是在新的段中創建的,它在數據文件的第一個空閒塊中開始?我不這麼認爲.. – ZZa

+0

如果你想避免出口進口路線,這將是值得一試的,這可能最終成爲你唯一可行的選擇。 –

+3

@ZZa您還可以在以下鏈接中使用maxshrink.sql腳本來確定您可以縮小每個數據文件的大小。 [AskTom鏈接](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:153612348067) – mtwaddell