丢失当前的联机重做日志文件(redo文件)

 

 

首先需要说明,如果当前的联机重做日志文件丢失,即使有备份,也肯定会丢失数据(运气好的话,也许不会丢失业务数据,不过这种机率非常非常小)。

1.模拟文件丢失

手动删除当前的联机重做日志文件(如何确定哪个重做日志文件才是当前状态,就不用再描述了吧),这里注意一点,数据库在打开状态时,丢失当前的联机重做日志文件会造成数据库崩溃,也就是数据库应该是处于不一致状态,为了尽可能贴近实际情况,这里在关闭数据库时通过SHUTDOWN ABORT方式关闭:

 
 
  1. SQL> SHUTDOWN ABORT  
  2. ORACLE instance shut down.  
  3. SQL> STARTUP MOUNT;  
  4. ORACLE instance started.  
  5. Total System Global Area  167772160 bytes  
  6. Fixed Size                  1295608 bytes  
  7. Variable Size              83888904 bytes  
  8. Database Buffers           75497472 bytes  
  9. Redo Buffers                7090176 bytes  
  10. Database mounted.  
  11. SQL> host del F:\ORACLE\ORADATA\JSSBOOK\REDO03.LOG 

然后尝试启动数据库:

 
 
  1. SQL> ALTER DATABASE OPEN;  
  2. alter database open 
  3. *  
  4. ERROR at line 1:  
  5. ORA-00313: open failed for members of log group 3 of thread 1  
  6. ORA-00312: online log 3 thread 1: '  
  7. F:\ORACLE\ORADATA\JSSBOOK\REDO03.LOG'  
  8. ORA-27041: unable to open file  
  9. OSD-04002: 无法打开文件  
  10. O/S-Error: (OS 2) 系统找不到指定的文件。 

2.尝试直接修复联机重做日志文件

尝试通过ALTER DATABASE CLEAR LOGFILE命令修复丢失的重做日志文件:

 
 
  1. SQL> ALTER DATABASE CLEAR LOGFILE GROUP 3;  
  2. alter database clear logfile group 3  
  3. *  
  4. ERROR at line 1:  
  5. ORA-01624: log 3 needed for crash recovery of   
  6. instance jssbook (thread 1)  
  7. ORA-00312: online log 3 thread 1: 'F:\ORACLE\  
  8. ORADATA\JSSBOOK\REDO03.LOG' 

根据错误信息可知,丢失的重做日志文件中包含必备的重做信息,无法被CLEAR。

3.执行不完全恢复

如果是归档模式并且有备份,建议通过备份进行不完全恢复,正常情况下只丢失当前联机重做日志文件中的数据。

如果没有备份,就只能强制恢复了。这里我们需要修改一个隐藏的初始化参数:

 
 
  1. SQL> ALTER SYSTEM SET "_ALLOW_RESETLOGS_CORRUPTION"=  
  2. TRUE SCOPE=SPFILE;  
  3. System altered. 

_ALLOW_RESETLOGS_CORRUPTION是一个隐藏参数,设置该参数值为TRUE后,Oracle在OPEN时会跳过一些一致性的检查。

关闭并重新启动数据库到MOUNT状态:

 
 
  1. SQL> SHUTDOWN IMMEDIATE  
  2. ORA-01109: database not open 
  3. Database dismounted.  
  4. ORACLE instance shut down.  
  5. SQL> startup mount  
  6. ORACLE instance started.  
  7. Total System Global Area  167772160 bytes  
  8. Fixed Size                  1295608 bytes  
  9. Variable Size              83888904 bytes  
  10. Database Buffers           75497472 bytes  
  11. Redo Buffers                7090176 bytes  
  12. Database mounted. 

对数据库进行不完全恢复:

 
 
  1. SQL> RECOVER DATABASE UNTIL CANCEL;  
  2. ORA-00279: change 375734 generated at 05/04/2009   
  3. 15:41:22 needed for thread 1  
  4. ORA-00289: suggestion : F:\ORACLE\ORADATA\JSSBOOK\ARCHIVE\  
  5. ARC00039_0684946360.001  
  6. ORA-00280: change 375734 for thread 1 is in sequence #39  
  7. Specify log: {=suggested | filename | AUTO | CANCEL}  
  8. cancel  
  9. ORA-01547: warning: RECOVER succeeded but   
  10. OPEN RESETLOGS would get error below  
  11. ORA-01194: file 1 needs more recovery to be consistent  
  12. ORA-01110: data file 1: 'F:\ORACLE\ORADATA\JSSBOOK\SYSTEM01.DBF' 
  13. ORA-01112: media recovery not started  
  14. 通过OPEN RESETLOGS方式打开数据库:  
  15. SQL> ALTER DATABASE OPEN RESETLOGS;  
  16. Database altered. 

4.善后处理

这种恢复方式是没有办法中的办法,通过这种方式恢复,有可能会导致数据库中数据的不一致,如已提交的数据未写入数据文件,而未提交的数据倒是被写入了数据文件。即使数据库被打开,也能够访问其中的表和数据,也只是看起来正常,如果你注意关注数据库的Alert文件(默认路径在$ORACLE_BASE\admin\SID\bdump\alert_SID.log,注意替换上述路径中的SID为正确的SID),有可能其中已经报出了无数个ORA-00600的错误。因此,如果数据库能够顺利打开,强烈建议马上通过EXPORT逻辑导出的方式执行一次FULL EXPORT。然后新建数据库,再通过IMPORT导入之前导出的二进制文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值