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_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