Oracle之降低高水位線

梓沐發表於2016-02-15

Shrink方式

10g開始,Oracle開始提供Shrink的命令,假如我們的表空間中支援自動段空間管理(ASSM),就可以使用這個特性縮小段,即降低HWM。這裡需要強調一點,10g的這個新特性,僅對ASSM表空間有效,否則會報 ORA-10635: Invalid segment or tablespace type

一、segment shrink大概分為兩個階段:

1、資料重組(compact):透過一系列insertdelete操作,將資料儘量排列在段的前面。在這個過程中需要在表上加RX鎖,即只在需要移動的行上加鎖。由於涉及到rowid的改變,需要enable row movement.同時要disable基於rowidtrigger.這一過程對業務影響比較小。

2HWM調整:第二階段是調整HWM位置,釋放空閒資料塊。此過程需要在表上加X鎖,會造成表上的所有DML語句阻塞。在業務特別繁忙的系統上可能造成比較大的影響。

二、使用方法

1、使用前提

更新統計資訊

因為所有的資訊都是根據dba_tables,表的資訊是根據統計資訊得到的,所以如果統計資訊不準確,那麼整個搜尋的結果都可能是錯誤的;

統計資訊的指令碼:exec dbms_stats.gather_table_stats('user','table_name');

開啟動行移動

在使用shrink功能時,必須對錶開啟動行移動功能

alter table enable row movement ;

2、語法

alter table shrink space [ | compact | cascade ];

alter table shrink space 兩個階段都執行。收縮表,降低 high water mark

alter table shrink space compcat 只執行第一個階段。收縮表,但會保持 high water mark

alter table shrink space cascade 兩個階段都執行。收縮表,降低 high water mark,並且相關索引也會收縮。

注意:如果系統業務比較繁忙,可以先執行shrink space compact重組資料,然後在業務不忙的時候再執行shrink space降低HWM釋放空閒資料塊。

3、檢查HWM方法

select  

a.file_id,

a.file_name,

a.filesize,

b.freesize,

(a.filesize - b.freesize) usedsize,

c.hwmsize,

c.hwmsize - (a.filesize - b.freesize) can_shrink_hwm_size,

a.filesize - c.hwmsize can_shrink_filesize

from

(select file_id,file_name,round(bytes/1024/1024) filesize from dba_data_files) a,

(select file_id,round(sum(bytes)/1024/1024) freesize from dba_free_space group by file_id) b,

(select file_id,round(max(block_id)*8/1024) hwmsize from dba_extents where tablespace_name='CANCER' group by file_id) c  

where a.file_id = b.file_id and a.file_id=c.file_id;

shrink注意:

1. move時產生的日誌比shrink時少.參看http://blog.csdn.net/huang_xw/article/details/7016365

2. shrink在移動行資料時,也一起維護了index上相應行的資料rowid的資訊,當然shrink過程中用來維護index的成本也會比較高。而表moveindex的狀態是UNUSABLE,需要進行rebuild。參見http://blog.csdn.net/huang_xw/article/details/7016415

3. oracle是從後向前移動行資料,那麼,shrink的操作就不會像move一樣,shrink不需要使用額外的空閒空間。

Move方式

執行表重建指令 alter table table_name move tablespace tablespace_name(驗證不可行,不降低水位線,但可釋放表空間),可以將表空間進行resize以後,再將物件move回來,可以降低水位線。

Move後會引發索引失效記得重建索引

查詢失效索引語句:

select 'alter index '||index_name||' rebuild tablespace '||tablespace_name||';' from dba_indexes where owner='owner_name' and status<>'VALID';

重建索引語句:將上述語句執行查詢的結果執行即可。

Exp方式

將佔用高水位的物件用exp匯出後,將物件在徹底刪除後,resize表空間大小,再將匯出的檔案重新imp即可。或者全部匯出exp,刪除表空間重建,再imp也可。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29812844/viewspace-1988804/,如需轉載,請註明出處,否則將追究法律責任。

相關文章