您的位置:首页 > 数据库

未启用归档数据库非数据文件(spfile,control,redo,undo,temp)全丢失的恢复方法

2010-11-29 17:19 876 查看
本文介绍了一个未启用归档数据库的,没有任何备份,所有非数据文件(spfile,control,redo,undo,temp)全丢失的恢复方法。非数据文件包括启动参数文件、重做日志文件、撤消表空间及临时表空间文件。

[b]测试环境:[/b]

假设一个数据库包括如下文件:

控制文件:

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.重启服务(仅[b]windows系统)[/b]

以下命令表示只启动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 openresetlogs;

数据库已更改。

如果未执行第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>

----------->恢复完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐