以下內容轉自:http://lovexueer.itpub.net/post/5072/49241
12月26日(星期一)
測試環境:
OS :XP
DB:9201
本測試測試了如下情況:
a.正常關閉資料庫,資料庫(未)歸檔,復原段資料表空間丟失,成功恢複
b.非正常關閉資料庫,資料庫非歸檔,有活動事務,復原段資料表空間丟失,成功恢複
c.非正常關閉資料庫,資料庫歸檔,有活動事務,復原段資料表空間丟失,恢複失敗,目前不知原因
a.正常關閉資料庫, 資料庫(未)歸檔
如shutdown normal,shutdown immediate
1.正常關閉資料庫,類比復原段資料表空間丟失
SQL> conn sys/test@jumper as sysdba
已串連。
SQL> shutdown immediate;
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
SQL> host del D:oracleoradatajumperUNDOTBS01.DBF
SQL> startup
ORACLE 常式已經啟動。
Total System Global Area 126950220 bytes
Fixed Size 453452 bytes
Variable Size 109051904 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
ORA-01157: 無法標識/鎖定資料檔案 2 - 請參閱 DBWR 追蹤檔案
ORA-01110: 資料檔案 2: 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF'
2.確認復原段資料表空間丟失
SQL> select file#,online_status,error from v$recover_file;
FILE# ONLINE_ status error
---------- -------
2 ONLINE FILE NOT FOUND
SQL> select name from v$datafile where file#=2;
NAME
----------------------------------------------------
D:ORACLEORADATAJUMPERUNDOTBS01.DBF
3.開啟資料庫
SQL> alter database datafile 'D:ORACLEORADATAJUMPERUNDOTBS01.dbf' offline drop;
資料庫已更改。
SQL> alter database open;
資料庫已更改。
4.建立新的復原段資料表空間
SQL> select segment_name ,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1$ UNDOTBS1 OFFLINE
_SYSSMU2$ UNDOTBS1 OFFLINE
_SYSSMU3$ UNDOTBS1 OFFLINE
_SYSSMU4$ UNDOTBS1 OFFLINE
_SYSSMU5$ UNDOTBS1 OFFLINE
_SYSSMU6$ UNDOTBS1 OFFLINE
_SYSSMU7$ UNDOTBS1 OFFLINE
_SYSSMU8$ UNDOTBS1 OFFLINE
_SYSSMU9$ UNDOTBS1 OFFLINE
_SYSSMU10$ UNDOTBS1 OFFLINE
已選擇11行。
SQL> create undo tablespace undots datafile 'undotbs02.dbf' size 100m autoextend on next 10m maxsize 200m
2 ;
資料表空間已建立。
SQL> alter system set undo_tablespace=undots;
系統已更改。
SQL> drop tablespace UNDOTBS1 including contents and datafiles;
資料表空間已丟棄。
SQL> select segment_name ,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ---------------
SYSTEM SYSTEM ONLINE
_SYSSMU11$ UNDOTS ONLINE
_SYSSMU12$ UNDOTS ONLINE
_SYSSMU13$ UNDOTS ONLINE
_SYSSMU14$ UNDOTS ONLINE
_SYSSMU15$ UNDOTS ONLINE
_SYSSMU16$ UNDOTS ONLINE
_SYSSMU17$ UNDOTS ONLINE
_SYSSMU18$ UNDOTS ONLINE
_SYSSMU19$ UNDOTS ONLINE
_SYSSMU20$ UNDOTS ONLINE
已選擇11行。
5.重新啟動
SQL> startup force;
ORACLE 常式已經啟動。
Total System Global Area 126950220 bytes
Fixed Size 453452 bytes
Variable Size 109051904 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select segment_name ,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU11$ UNDOTS ONLINE
_SYSSMU12$ UNDOTS ONLINE
_SYSSMU13$ UNDOTS ONLINE
_SYSSMU14$ UNDOTS ONLINE
_SYSSMU15$ UNDOTS ONLINE
_SYSSMU16$ UNDOTS ONLINE
_SYSSMU17$ UNDOTS ONLINE
_SYSSMU18$ UNDOTS ONLINE
_SYSSMU19$ UNDOTS ONLINE
_SYSSMU20$ UNDOTS ONLINE
已選擇11行。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- -----------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTS
通過上述方法,(未)歸檔都可以正常開啟資料庫
b.非正常關閉資料庫(資料庫未歸檔)
如shutdown abort或crash
1.產生測試資料
SQL> conn test/test@jumper
已串連。
SQL> truncate table test;
表已截掉。
SQL> insert into test values(1);
已建立 1 行。
2.非正常關閉資料庫,刪除復原段資料表空間
再開啟一視窗
SQL> shutdown abort
ORACLE 常式已經關閉。
SQL> host del D:oracleoradatajumperUNDOTBS01.DBF
3.建立啟動參數檔案
SQL> startup
ORACLE 常式已經啟動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
ORA-01157: 無法標識/鎖定資料檔案 2 - 請參閱 DBWR 追蹤檔案
ORA-01110: 資料檔案 2: 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF'
SQL> create pfile from spfile;
檔案已建立。
SQL> shutdown immediate
ORA-01109: 資料庫未開啟
已經卸載資料庫。
ORACLE 常式已經關閉。
4.修改啟動參數檔案D:oracleora92databaseinitjumper.ora,moun資料庫
原來參數:
undo_management='AUTO'
undo_tablespace='UNDOTBS1'
修改為:
undo_management='manual'
undo_tablespace='system'
_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
5.SQL> startup mount pfile=D:oracleora92databaseinitjumper.ora
ORACLE 常式已經啟動。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
5.確認undo資料表空間丟失
SQL> select file#,error from v$recover_file;
FILE# ERROR
---------- ---------------------------------------
2 FILE NOT FOUND
SQL> select name from v$datafile where file#=2;
NAME
------------------------------------------------------------
D:ORACLEORADATAJUMPERUNDOTBS01.DBF
6.開啟資料庫
SQL> alter database datafile 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF' offline drop;
資料庫已更改。
SQL> recover database;
完成介質恢複。
SQL> alter database open;
資料庫已更改。
SQL> conn test/test@jumper;
已串連。
SQL> select *from test;
ID
----------
1
7.建立新的ROLLBACK 資料表空間
SQL> select * from v$rollname;
USN NAME
---------- ------------------------------
0 SYSTEM
SQL> select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU2$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU3$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU4$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU5$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU6$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU7$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU8$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU9$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU10$ UNDOTBS1 NEEDS RECOVERY
已選擇11行。
SQL> drop rollback segment "_SYSSMU1$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU2$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU3$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU4$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU5$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU6$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU7$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU8$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU9$";
回退段已刪除。
SQL> drop rollback segment "_SYSSMU10$";
回退段已刪除。
SQL> drop tablespace UNDOTBS1 including contents and datafiles;
資料表空間已丟棄。
SQL> select segment_name,tablespace_name ,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ -------------
SYSTEM SYSTEM ONLINE
SQL> create undo tablespace undots datafile 'D:oracleoradatajumperundotbs02.dbf' size 10m ;
資料表空間已建立。
SQL> select segment_name,tablespace_name ,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME S