天天看點

未啟用歸檔資料庫非資料檔案(spfile,control,redo,undo,temp)全丢失的恢複方法

    本文介紹了一個未啟用歸檔資料庫的,沒有任何備份,所有非資料檔案(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