Oracle断电的一次恢复经历

Oracle数据库恢复文档:
客户数据库因为掉电,数据库不能正常启动。

故障现象:
进入应用程序的时候,提示:Oracle startup or shutdown in progress.....

诊断及解决过程:
1、SVRMGR> startup nomount;
  没有问题

2、SVRMGR> alter database mount;
出现在以下内容,乱码:
alter database mount
*
ORA-00214: ???? 'D:\ORACLE\ORADATA\ORACLE\CONTROL02.CTL' ?? 16788 ??? 'D:\ORACLE
\ORADATA\ORACLE\CONTROL01.CTL' ?? 16780 ???

3、为了解决这个乱码,先设置字符集,然后再重新来过一次:
SVRMGR> shutdown abort;
SVRMGR> exit;
c:\set nls_lang=american_america.zhs16gbk
SVRMGR> startup nomount;

4、SVRMGR> alter database mount;
出现以下内容,诊断是几个控制文件版本不一致:
alter database mount
*
ORA-00214: controlfile 'D:\ORACLE\ORADATA\ORACLE\CONTROL02.CTL' version 16788 in
consistent with file 'D:\ORACLE\ORADATA\ORACLE\CONTROL01.CTL' version 16780

解决方法:
打开init.ora,找到
control_files = ("d:\oracle\oradata\oracle\control01.ctl", "d:\oracle\oradata\oracle\control02.ctl", "d:\oracle\oradata\oracle\control03.ctl")
把它修改为:
control_files = ("d:\oracle\oradata\oracle\control02.ctl", "d:\oracle\oradata\oracle\control03.ctl")
去掉其中的第一个控制文件。

5、
SVRMGR>shutdown abort;
SVRMGR>startup nomount;
SVRMGR>alter databse mount;
SVRMGR>alter databse open;

这时出现这样的内容:
alter database open
*
ORA-00314: log 3 of thread 1, expected sequence# 3990 doesn't match 3987
ORA-00312: online log 3 thread 1: 'D:\ORACLE\ORADATA\ORACLE\REDO01.LOG'

诊断,log日志版本不对。

尝试以下操作,均告失败:
SVRMGR> alter database open resetlogs;
出现以下错误:
alter database open resetlogs
*
ORA-01139: RESETLOGS option only valid after an incomplete database recovery

SVRMGR> alter database open noresetlogs;
出现以下错误:
alter database open noresetlogs
*
ORA-01139: RESETLOGS option only valid after an incomplete database recovery

SVRMGR> recover database until time '2003-12-24:19:19:19';
出现以下错误:
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF'

SVRMGR> alter database open resetlogs;
出现以下错误:
alter database open resetlogs
*
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF'

6、
使用ORACLE数据库的部分数据恢复方式。
它的主要做法就是不检查数据库的一致性,来打开数据库,虽然会造成数据的不准确和丢失,
但是还是可以保存在大部分数据的。

做法:

打开init.ora,添加一行文字:
_allow_resetlogs_corruption=true

然后再进行以下操作:
SVRMGR>shutdown abort;
SVRMGR>startup mount;
SVRMGR>recover database until cancel
此时数据库提示
SVRMGR> recover database until cancel;
ORA-00279: change 3684318 generated at 12/30/2003 10:55:34 needed for thread 1
ORA-00289: suggestion : D:\ORACLE\ORA81\RDBMS\ARC00001.001
ORA-00280: change 3684318 for thread 1 is in sequence #1
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

输入 cancel,这时出现这样的信息:
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF'

SVRMGR>alter database open noresetlogs;

提示:
Statement processed.

这时,数据库已经起来了。
此时,要尽快把数据库导出来。

exp system/manager file=c:\oracle.dmp full=y ...

数据库一致性检查失败,oracle不能open。
  机器异常断电,oracle不能正常启动,可以mount,不能open。数据库未备份过。
错误码:
At startup, the database will mount, but gives the following errors at open:
ORA-00312: "online log %s thread %s: '%s'"
     Cause: This message reports the filename for details of another message.
    Action: Other messages will accompany this message. See the
            associated messages for the appropriate action to take.
ORA-00322: "log %s of thread %s is not current copy"
     Cause: Check of log file header at database open found that an online log  
            appears to be an incorrectly restored backup.
    Action: Restore correct file or reset logs.

解决方法描述:
首先检查ORACLE_HOME 和ORACLE_SID在startup参数中是否正确,如果不正确重新startup。

Recover the loss of an inactive, online redo log group.

SQL>ALTER DATABASE CLEAR LOGFILE 'filename';

If there is more than one LOGFILE in the redo log group then you must
specify all the log files.

For example, the following fails:

SVRMGR> alter database clear logfile '/vobs/oracle/dbs/log3.log';
alter database clear logfile '/vobs/oracle/dbs/log3.log'
*
ORA-1514: error in log specification: no such log
ORA-1517: log member: '/vobs/oracle/dbs/log3.log

But, specifying all the log files in the group works:
SVRMGR> ALTER DATABASE CLEAR LOGFILE ('/vobs/oracle/dbs/t4.log','/vobs/oracle/;
Statement processed.

介绍一个意外情况,如果上面的方法不成功,数据库还是不能open,采用recover,restore都不成功,说明logfile可能已经损坏,数据库打开需要做一致性检查,所以不能正常打开。因为数据库未作过备份,为了尽可能地减少损失,采用打开数据库,然后立刻导出数据的方法。
oracle有一个不推荐的方法,可以使数据库在不进行一致性检查的方式下打开数据库。
做法:
1。为保险起见,将数据库的系统表空间,数据文件,控制文件均做一次备份:copy。
2。在初始化配置文件中(init.ora)加上:
_allow_resetlogs_corruption=true
_corrupted_rollback_segments=(将所有rollback_segments=(...)的内容加到这里)
将rollback_segments=(...)前加上#
3。startup mount
recover database until cancel;
cancel
alter database open resetlogs;
此时数据库已经可以打开了,请立刻将数据export出来,然后重新安装oracle,重新建立database,再将数据import。
注意:这种方法属于数据库的不完全恢复,最后提交的sql可能会丢失,毕竟能够尽可能地减少损失,可以试试。
以上操作我均做过测试。