Oracle Reog datafile

Oracle Reog datafile

標籤: 

Oracle Reog datafile: 
Oracle: Oracle 10G 
Method:Move C5_SYS_DATA_2 to C5_SYS_DATA 
縮小空間有兩種方法:(此兩種方法都會把Highwater做移動,所以有辦法縮小空間) 
一、        做export/import(本例已做過export/import,所以空間不會改變) 
二、        建立新的datafile,把資料move過去,刪除舊的tablespace(此範列) 


 
1.        確認資料型態 
發現上面有INDEX & TABLE兩種類型 
select segment_type , count(1) from dba_segments 
where tablespace_name='C5_SYS_DATA_2' group by segment_type; 

SEGMENT_TYPE         COUNT(1) 
—————— ———- 
INDEX                      25 
TABLE                      10 

2.        Create tablespace C5_SYS_DATA 

SQL> CREATE TABLESPACE C5_SYS_DATA DATAFILE '/oradata2/c5tmes1/C5_SYS_DATA_01.dbf' SIZE 10M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED; 

3.        搬移資料到C5_SYS_DATA,因資料太多,使用SQL語法產生 
select 'alter table '||owner||'.'||table_name||' move tablespace C5_SYS_DATA;' 
from dba_tables where tablespace_name = 'C5_SYS_DATA_2'; 

PS.table 搬完之後,所有的index都要做rebuild
若有Mview,Mview若使用的是row id(Refresh method),所有的Mview都需要重新跑一次
若Mview所使用的是primary key,Mview就不必在抄寫一次。

做完之後,剩下INDEX 
 

4.        搬移INDEX 

select 'ALTER INDEX '||owner||'.'||index_name||'  REBUILD tablespace C5_SYS_DATA online;' 
from dba_indexes 
where tablespace_name='C5_SYS_DATA_2'; 

搬移過程中出現錯誤,ORA-28650: Primary index on an IOT cannot be rebuilt,因為他不是一般的INDEX,需要move的方式搬移 
 
再次確認是否為IOT – TOP的類型: 
select INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE, STATUS,TABLESPACE_NAMEfrom dba_indexes where tablespace_name='C5_SYS_DATA_2'; 
 

因它的TABLE_TYPE是TABLE,所以用MOVE的方式做搬移: 
SELECT 'ALTER TABLE '||owner||'.'||TABLE_NAME||' MOVE TABLESPACE C5_SYS_DATA;' 
from dba_indexes where tablespace_name='C5_SYS_DATA_2'; 

 

5. 最後確認裡面是否有資料 
 
從TOAD裡面看,資料也搬移過去了,原來的C5_SYS_DATA_2已沒有資料了 
 

6. 確認INDEX是否都正常: 
select 'ALTER INDEX '||owner||'.'||index_name||'  REBUILD ONLINE;' 
from dba_indexes 
where status='UNUSABLE'; 
ALTER INDEX AOE_SYS.ARRAY_PARAM_COLL_STEP_T_PK  REBUILD ONLINE; 

7. 刪除資料或把Datafile縮小 
一、把TABLESPACE刪除 
Drop tablespace C5_SYS_DATA_2 INCLUDING CONTENTS AND DATAFILES; 

二、把空間縮小 
select 'alter database datafile '''||name || ''' resize 10M;' 
from v$datafile  where name like '%C5_SYS_DATA%.dbf' 

alter database datafile '/oradata2/c5tmes1/C5_SYS_DATA_02.dbf' resize 10M; 

假設無法縮小,必需找出High water 在那邊: 

SELECT 'alter database datafile '||DBADF.FILE_ID ||' resize '||CEIL( (NVL(HWM,1)*8192)/1024/1024 )||'m  ;' 
FROM DBA_DATA_FILES DBADF, ( SELECT FILE_ID, MAX(BLOCK_ID+BLOCKS-1) HWM FROM DBA_EXTENTS GROUP BY FILE_ID ) DBAFS 
WHERE DBADF.FILE_ID = DBAFS.FILE_ID(+) 
and file_name like '%C5%' 
and (CEIL( BLOCKS*8192/1024/1024) – CEIL( (NVL(HWM,1)*8192)/1024/1024 )>10); 

參考資料: 
http://blog.xuite.net/charley_ocp/mydba01/36094404