本文介紹了一個未啟用歸檔資料庫的,沒有任何備份,所有非資料檔案(spfile,control,redo,undo,temp)全丢失的恢複方法。非資料檔案包括啟動參數檔案、重做日志檔案、撤消表空間及臨時表空間檔案。 測試環境: 假設一個資料庫包括如下檔案: 控制檔案:
CONTROL01.CTL
CONTROL02.CTL
CONTROL03.CTL
重做日志檔案:
REDO01.LOG
REDO02.LOG
REDO03.LOG
臨時檔案:
TEMP01.DBF
撤消表空間:
UNDOTBS01.DBF
資料檔案:
DRSYS01.DBF
INDX01.DBF
SYSTEM01.DBF
TOOLS01.DBF
USERS01.DBF
XDB01.DBF 現在僅存在資料檔案:
DRSYS01.DBF
INDX01.DBF
SYSTEM01.DBF
TOOLS01.DBF
USERS01.DBF
XDB01.DBF 其它檔案都沒有了,備份也沒有,但是資料檔案事務是完整的(上次是正常關閉),且資料庫未啟用歸檔。 以下是恢複步驟:
1.建立啟動參數檔案
c:/mypfile.ora 啟動參數可以從alert.log中啟動資訊中COPY下來,也可以自己手工寫一個。
如下所示:
注:
由于撤消表空間檔案沒有,是以去除撤消段自動管理相關參數(undo_management,undo_retention,undo_tablespace)
control_files指定為你想要建立的新的控制檔案 *.compatible='9.2.0.0.0'
*.control_files='H:/oracle/oradata/ydgl/control01.ctl','H:/oracle/oradata/ydgl/control02.ctl','H:/oracle/oradata/ydgl/control03.ctl'
*.db_block_size=8192
*.db_cache_size=25165824
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='ydgl'
*.instance_name='ydgl'
*.pga_aggregate_target=25165824
*.shared_pool_size=50331648
#*.undo_management='AUTO'
#*.undo_retention=10800
#*.undo_tablespace='UNDOTBS1' 2.重新開機服務(僅windows系統) 以下指令表示隻啟動ORACLE服務,不啟動資料庫執行個體。 oradim -stop -sid ydgl oradim -startup -sid ydgl -starttype srvc
3.使用建立的pfile啟動到未加載模式 startup nomount pfile='c:/mypfile.ora'
e:/>sqlplus SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 5月 21 21:51:19 2008 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 請輸入使用者名: / as sysdba
已連接配接到空閑例程。 SQL> startup nomount pfile='c:/mypfile.ora'
ORACLE 例程已經啟動。 Total System Global Area 114367248 bytes
Fixed Size 453392 bytes
Variable Size 88080384 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL>
4.使用resetlogs建立控制檔案,建立後的控制檔案由mypfile.ora中的*.control_files指定 CREATE CONTROLFILE REUSE DATABASE "YDGL" RESETLOGS NOARCHIVELOG
MAXLOGFILES 5
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 1
LOGFILE--指定新的重做日志檔案的組和位置(不一定要和原來一樣)
GROUP 1 'H:/ORACLE/ORADATA/YDGL/REDO01.LOG' SIZE 10M,
GROUP 2 'H:/ORACLE/ORADATA/YDGL/REDO02.LOG' SIZE 10M,
GROUP 3 'H:/ORACLE/ORADATA/YDGL/REDO03.LOG' SIZE 10M
DATAFILE
'H:/ORACLE/ORADATA/YDGL/SYSTEM01.DBF',
-- 'H:/ORACLE/ORADATA/YDGL/UNDOTBS01.DBF',去除撤消表空間(因為檔案不存在)
'H:/ORACLE/ORADATA/YDGL/DRSYS01.DBF',
'H:/ORACLE/ORADATA/YDGL/INDX01.DBF',
'H:/ORACLE/ORADATA/YDGL/TOOLS01.DBF',
'H:/ORACLE/ORADATA/YDGL/USERS01.DBF',
'H:/ORACLE/ORADATA/YDGL/XDB01.DBF'
CHARACTER SET ZHS16GBK
;
5.使用重建的控制檔案恢複資料庫 RECOVER DATABASE USING BACKUP CONTROLFILE; SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-00279: 更改 133071 (在 05/18/2008 17:46:33 生成) 對于線程 1 是必需的
ORA-00289: 建議: C:/ORACLE/ORA92/RDBMS/ARC00066.001
ORA-00280: 更改 133071 對于線程 1 是按序列 # 66 進行的
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
媒體恢複已取消。
SQL>
6.設定_allow_resetlogs_corruption參數,并重新開機資料庫到mount 修改mypfile.ora,增加_allow_resetlogs_corruption=true 這個參數的意思是允行打開重做日志檔案損壞的資料庫 *.compatible='9.2.0.0.0'
*.control_files='H:/oracle/oradata/ydgl/control01.ctl','H:/oracle/oradata/ydgl/control02.ctl','H:/oracle/oradata/ydgl/control03.ctl'
*.db_block_size=8192
*.db_cache_size=25165824
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='ydgl'
*.instance_name='ydgl'
*.pga_aggregate_target=25165824
*.shared_pool_size=50331648
#*.undo_management='AUTO'
#*.undo_retention=10800
#*.undo_tablespace='UNDOTBS1'
_allow_resetlogs_corruption=true SQL> shutdown immediate;
ORA-01109: 資料庫未打開
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount pfile='c:/mypfile.ora'
ORACLE 例程已經啟動。 Total System Global Area 114367248 bytes
Fixed Size 453392 bytes
Variable Size 88080384 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
SQL> 7.使用resetlogs打開資料庫 SQL> alter database open resetlogs; 資料庫已更改。
如果未執行第6步,不設定啟動參數_allow_resetlogs_corruption=true,打開資料庫時則會出現如下的錯誤提示: SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: 檔案 1 需要媒體恢複
ORA-01110: 資料檔案 1: 'H:/ORACLE/ORADATA/YDGL/SYSTEM01.DBF'
8.檢查丢失的表空間及資料檔案 SQL> select a.ts#, a.name, b.file#, b.status, b.name from ts$ a, v$datafile b where a.TS# = b.TS#(+);
TS# NAME FILE# STATUS NAME
---------- ------------------------------ ---------- ------- --------------------------------------------------------------------------------
0 SYSTEM 1 SYSTEM H:/ORACLE/ORADATA/YDGL/SYSTEM01.DBF
1 UNDOTBS1 2 RECOVER C:/ORACLE/ORA92/DATABASE/MISSING00002
2 TEMP
3 DRSYS 3 ONLINE H:/ORACLE/ORADATA/YDGL/DRSYS01.DBF
4 INDX 4 ONLINE H:/ORACLE/ORADATA/YDGL/INDX01.DBF
5 TOOLS 5 ONLINE H:/ORACLE/ORADATA/YDGL/TOOLS01.DBF
6 USERS 6 ONLINE H:/ORACLE/ORADATA/YDGL/USERS01.DBF
7 XDB 7 ONLINE H:/ORACLE/ORADATA/YDGL/XDB01.DBF
8 rows selected
SQL>
從中可以看到撤消表空間UNDOTBS1及臨時表空間TEMP檔案還未恢複 9.增加臨時表空間TEMP的檔案 SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'H:/ORACLE/ORADATA/YDGL/TEMP01.DBF' SIZE 50M REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 1000M;
Tablespace altered 10.恢複撤消表空間UNDOTBS1 由于撤消表空間的資料檔案已經沒有了,是以隻能重建 首先需删除殘餘的表空間資訊,然後再建立。 SQL> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES;
Tablespace dropped
SQL> CREATE UNDO TABLESPACE "UNDOTBS1" DATAFILE 'H:/oracle/oradata/ydgl/UNDOTBS01.dbf' SIZE 50M;
Tablespace created
SQL>
11.建立SPFILE,重新開機資料庫
從mypfile.ora中取消恢複資料時使用的_allow_resetlogs_corruption=true
增加撤消段參數 *.compatible='9.2.0.0.0'
*.control_files='H:/oracle/oradata/ydgl/control01.ctl','H:/oracle/oradata/ydgl/control02.ctl','H:/oracle/oradata/ydgl/control03.ctl'
*.db_block_size=8192
*.db_cache_size=25165824
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='ydgl'
*.instance_name='ydgl'
*.pga_aggregate_target=25165824
*.shared_pool_size=50331648
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
--建立SPFILE
SQL> create spfile from pfile='c:/mypfile.ora'; 檔案已建立。
--重新開機資料庫
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。 SQL> startup;
ORACLE 例程已經啟動。 Total System Global Area 114367248 bytes
Fixed Size 453392 bytes
Variable Size 88080384 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
資料庫裝載完畢。
資料庫已經打開。
SQL> show parameter spfile; NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string %ORACLE_HOME%/DATABASE/SPFILE%
ORACLE_SID%.ORA
SQL>
-----------恢複完成 葉正盛(MKing) 2008-05-22