2013/10/04

Published 10月 04, 2013 by

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_NAME from dba_indexes where tablespace_name='C5_SYS_DATA_2';


因它的TABLE_TYPETABLE,所以用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