本文介绍了一个未启用归档数据库的,没有任何备份,所有非数据文件(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 进行的
指定日志: {=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>
-----------恢复完成