Oracle資料庫管理——表資料庫高水位及shrink操作

Z少校發表於2020-03-03

segment shrink分為兩個階段:  

1、資料重組(compact):透過一系列insert、delete操作,將資料儘量排列在段的前面。

在這個過程中需要在表上加RX鎖,即只在需要移動的行上加鎖。由於涉及到rowid的改變,需要enable row movement.

同時要disable基於rowid的trigger.這一過程對業務影響比較小。  

2、HWM調整:第二階段是調整HWM位置,釋放空閒資料塊。此過程需要在表上加X鎖,會造成表上的所有DML語句阻塞。

在業務特別繁忙的 上可能造成比較大的影響。  shrink space語句兩個階段都執行。  shrink space compact只執行第一個階段。  

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

 shrink必須開啟行遷移功能。 

 alter table table_name enable row movement ;  

注意:alter table XXX enable row movement語句會造成引用表XXX的物件(如儲存過程、包、檢視等)變為無效。執行完成後,最好執行一下utlrp.sql來編譯無效的物件。  

語法: 

 alter table <table_name> shrink space [ <null> | compact | cascade ];  

alter table <table_name> shrink space compcat;  

  收縮表,相當於把塊中資料打結實了,但會保持 high water mark;  

alter table <tablespace_name> shrink space;  

收縮表,降低 high water mark;  

alter table <tablespace_name> shrink space cascade; 

 收縮表,降低 high water mark,並且相關索引也要收縮一下下。 

 alter index idxname shrink space;  回縮索引  

1:普通表  Sql指令碼,改指令碼會生成相應的語句 

 select’alter table ‘||table_name||’ enable row movement;’||chr(10)||’alter table ‘||table_name||’ shrink space;’||chr(10)from user_tables;  

select’alter index ‘||index_name||’ shrink space;’||chr(10)from user_indexes; 

 2:分割槽表的處理  進行shrink space時 發生ORA-10631錯誤.shrink space有一些限制.  在表上建有函式索引(包括全文索引)會失敗。  

Sql指令碼,改指令碼會生成相應的語句 

 select ‘alter table ‘||table_name||’ enable row movement;’||chr(10)||’alter table ‘||table_name||’ shrink space;’||chr(10) from user_tables where ;  

select ‘alter index ‘||index_name||’ shrink space;’||chr(10) from user_indexes where uniqueness=’NONUNIQUE’ ;    

  select ‘alter table ‘||segment_name||’ modify subpartition ‘||partition_name||’ shrink space;’||chr(10) from user_segments where segment_type=’TABLE SUBPARTITION’ ‘;  

另外,對於頻繁操作的表可以快取到記憶體中  oracle的db_buffer_pool由三部分組成:

  buffer_pool_defualt 

 buffer_pool_keep

  buffer_pool_recycle 

 如果要把表釘死在記憶體中,也就是把表釘在keep區。 

 相關的命令為:

  alter table ….. storage(buffer_pool keep);  

這句命令把表示表如果快取的話是快取在keep區。  

可以透過語句:  

select table_name from dba_tables where buffer_pool=’KEEP’;

查詢到改表是放在keep區中的。  但是不意味著表已經被快取了。  

下面的語句把表快取: 

 alter table …. cache;  

可以透過  

select table_name from dba_ tables where rtrim(cache)=’Y’ 

 查詢到該表已經被快取了。  

加入到keep區的表不是說不能被移出記憶體,不過是比較不容易移出記憶體。  

也可以手工來移出記憶體,命令如下: 

 alter table … nocache; 

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

相關文章