在一次要縮小undo的空間時,用Oracle Enterprise Manager來offline Undo File,結果出現錯誤,因為有segments仍在使用中。
但是忘了做了什麼動作,以致它最後還是將undo file離線,並且在後續操作中出現了undo file需要做recovery的訊息。
ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/testdb/oradata/undo01.dbf'
先找出有哪些segment還在使用。
SQL> select tablespace_name,segment_name,status from dba_rollback_segs where status='NEEDS RECOVERY';
TABLESPACE_NAME SEGMENT_NAME STATUS
------------------------------ ------------------------------ ----------------
APPS_UNDOTS1 _SYSSMU1$ NEEDS RECOVERY
APPS_UNDOTS1 _SYSSMU2$ NEEDS RECOVERY
APPS_UNDOTS1 _SYSSMU3$ NEEDS RECOVERY
APPS_UNDOTS1 _SYSSMU4$ NEEDS RECOVERY
將資料庫關閉,備份init.ora,編輯init.ora,修改兩個參數值如下:
undo_management='MANUAL'
rollback_segments='SYSTEM'
在init.ora加上一個隱藏的參數,值為SQL找到的SEGMENT_NAME,收回segment如下:
*._offline_rollback_segments='_SYSSMU1$','_SYSSMU2$','_SYSSMU3$','_SYSSMU4$'
用pfile來開啟資料庫:
SQL> startup pfile=/testdb/db/9.2.0/dbs/init.ora ;
資料庫成功開啟之後,就可以新增新的Undo Tablespace:
SQL> create undo tablespace APPS_UNDOTS2 datafile '/testdb/oradata/UNDOTBS01.DBF' size 10000m;
刪除舊的Undo Tablespace;
DROP TABLESPACE APPS_UNDOTS1 INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS ;
關閉資料庫,將備份的init.ora還原,並且修改init.ora
將undo_tablespace=APPS_UNDOTS1改為APPS_UNDOTS2
重新開啟資料庫,ok
但是忘了做了什麼動作,以致它最後還是將undo file離線,並且在後續操作中出現了undo file需要做recovery的訊息。
ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/testdb/oradata/undo01.dbf'
先找出有哪些segment還在使用。
SQL> select tablespace_name,segment_name,status from dba_rollback_segs where status='NEEDS RECOVERY';
TABLESPACE_NAME SEGMENT_NAME STATUS
------------------------------ ------------------------------ ----------------
APPS_UNDOTS1 _SYSSMU1$ NEEDS RECOVERY
APPS_UNDOTS1 _SYSSMU2$ NEEDS RECOVERY
APPS_UNDOTS1 _SYSSMU3$ NEEDS RECOVERY
APPS_UNDOTS1 _SYSSMU4$ NEEDS RECOVERY
將資料庫關閉,備份init
undo_management='MANUAL'
rollback_segments='SYSTEM'
在init
*._offline_rollback_segments='_SYSSMU1$','_SYSSMU2$','_SYSSMU3$','_SYSSMU4$'
用pfile來開啟資料庫:
SQL> startup pfile=/testdb/db/9.2.0/dbs/init
資料庫成功開啟之後,就可以新增新的Undo Tablespace:
SQL> create undo tablespace APPS_UNDOTS2 datafile '/testdb/oradata/UNDOTBS01.DBF' size 10000m;
刪除舊的Undo Tablespace;
DROP TABLESPACE APPS_UNDOTS1 INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS ;
關閉資料庫,將備份的init
將undo_tablespace=APPS_UNDOTS1改為APPS_UNDOTS2
重新開啟資料庫,ok