分类: Oracle
2009-02-02 16:46:05
ORALCE实例恢复详细分析汇总
1.数据库是处于关闭状态的
试图打开数据库时报ora-1157和ora-1110错误时,这时的解决方法取决于数据库是否是正常shutdown
如果是正常shutdown的,最简单的解决方法是已offline drop选项删除有问题的数据文件,然后已restriceted模式打开数据,删除并重建这个数据文件所属的那个回滚表空间。具体步骤:
a.确认数据库是正常shutdown的,可以检查alter.log文件,定位到最后几行看是否有如下的信息:alter database dismount
Completed: alter database dismount
b.在int
c.以restricted模式mount数据库 startup restrict mount;
d. offline drop 有问题的数据文件:
ALTER DATABASE DATAFILE 'xx' OFFLINE DROP;
e.打开数据库
alter database open;
如果返回"Statement processed"信息,转到第g步
f.因为打开数据库失败,shutdown数据库,并编辑int
注释掉rollback_segment,并加入一行
_corrupted_rollback_segments = (<rollback1>,...,<rollbackN> )
然后startup restrict
g.删除掉那个有问题文件所属的回滚段表空间
DROP TABLESPACE <tablespace name> INCLUDING CONTENTS
h.重建回滚段表空间和回滚段,并online
i.使数据库所有用户都可用
alter system disable restriced session;
j.在int
2.如果DB不是正常shutdown的
这种情况,db最近一次是用shutdown abort或是crash掉的,回滚段几乎一定包含活动的事务。因此,怀的那个数据文件不能offline或drop掉,你应该从备份恢复这个文件。如果数据库是处于noarchived模式的,只有最近的一些事务日志还没有被重写掉的情况才能成功恢复这个文件。具体步骤:
a.从备份中恢复丢失的那个数据文件
b.mount上db
c.执行:SELECT FILE#,NAME,STATUS FROM V$DATAFILE;
如果数据文件的状态是offline的,你必须先online
ALTER DATABASE DATAFILE '<full_path_file_name>' ONLINE
d.执行如下查询:
SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#
FROM V$LOG V1, V$LOGFILE V2 WHERE V1.GROUP# = V2.GROUP# ;
这将列出所有的redo log file和它们的序号及FIRST_CHANGE#
e.如果db处于noarchived,执行
SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;
如果其中的change#比d中的FIRST_CHANGE#大的话,用redo logfile 就可以完成恢复
f.如果其中的change#比d中的FIRST_CHANGE#小的话,则db是不能恢复的