Oracle数据库REDO日志损坏恢复处理

Oracle数据库REDO日志损坏恢复处理

最近有很多重要的事情要处理,更不巧的是网第数据处理服务器因掉电导致Oracle无法正常启动,因而导致网第最新排名数据迟迟没有发布。刚把一些重要的事情处理完毕,得以抽时间来解决Oracle数据库问题。经过一天半时间的处理,电话咨询了一位Oracle数据库专家,终于把问题彻底搞定。在此把解决方法记录下来:
 
1)查找问题症状
      以本地用户登录Oracle,尝试启动Oracle数据库
      sqlplus /nolog
      sql>connect  /as  sysdba 
      sql>startup;
          启动失败
      sql>startup mount;  
      sql>alter database open;  
          启动失败,提示REDO01.LOG文件异常
      sql>select group#,sequence#,archived,status from v$log;
          查看REDO日志情况。发现REDO01是当前日志
 
2)使用resetlogs参数恢复日志文件 
      以本地用户登录Oracle,执行以下参数  
      sql>startup mount; 
      sql>alter system set "_allow_resetlogs_corruption"=true scope=spfile;   
          这个参数是关键,可以允许Oracle重置REDO日志
      sql>alter system set events '10046 trace name context off';    
      sql>alter system set timed_statistics=false; 
      sql>alter session set events '10015 trace name ADJUST_SCN level 1';   
          如果level 1不可以的情况,改用level 7 
      sql>recover database until cancel;    
          使用CANCEL退出,运行后才可以使用resetlogs去open数据库
      sql>alter database open resetlogs;   
          提示fatal error。还是不能正常启动   
 
3)跟踪错误日志,设置相应参数 
      查看C:\oracle\product\10.2.0\admin\ora\bdump下面的启动alert_ora.log日志文件。发现有报ORA-00600: 内部错误代码,参数: [4193]的错误。经过查阅资料,是因为恢复时redo与undo不一致所导致。在alert文件中,确认undo segment数量为1至10。在数据库启动参数C:\oracle\product\10.2.0\db_1\database\initora.ora增加如下一行:
      _CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$, _SYSSMU2$, _SYSSMU3$, _SYSSMU4$, _SYSSMU5$, _SYSSMU6$, _SYSSMU7$, _SYSSMU8$, _SYSSMU9$, _SYSSMU10$)
      重新执行步骤2),数据库正常启动。最艰难的一步完成了,赶快导出相关数据。
 
4)重建UNDO表空间 
      以系统用户登录Oracle,执行以下语句  
      sql>create undo tablespace UNDOTBS2 datafile 'G:\oradata\datora\UNDOTBS02.DBF' size 100m; 
      sql>alter system set undo_tablespace=UNDOTBS2;
      sql>drop tablespace UNDOTBS1 including contents;
      sql>select * from dba_tablespaces;
       重启Oracle服务,才能删除表空间UNDOTBS1的物理文件。重启后以系统用户登录Oracle,重建UNDOTBS1表空间      
      sql>create undo tablespace UNDOTBS1 datafile 'G:\oradata\datora\UNDOTBS01.DBF' size 300m REUSE AUTOEXTEND ON NEXT 300M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL; 
      sql>alter system set undo_tablespace=UNDOTBS1; 
      sql>drop tablespace UNDOTBS2 including contents; 
      sql>select * from dba_tablespaces; 
 
5)单个表读取错误处理 
      经过第4)步后把第3)步增加的启动参数去掉,可以正常启动数据库了。但在执行排名数据处理过程中提示“没有找到对象错误”。经过业务跟踪,发现8月8日的表数据在做汇总处理的时候不能正常读取此表,但在增加rownum参数读取部分数据又可以成功。于是利用CREATE TABLE xxx AS SELECT ... WHERE ROWNUM<=xxx重新建立了8月8日的数据表。
      到目前为止,数据运算仍在正常运行中。
 

    其他参考示例:        

 

-- 命令符下启动Oracle

net start OracleDBConsoleorcl
net start OracleOraDb10g_home1iSQL*Plus
net start OracleOraDb10g_home1TNSListener
net start OracleServiceorcl
-- 命令符下进行监听程序的操作

C:\>lsnrctl start
C:\>lsnrctl stop
C:\>lsnrctl status

 

         

参考资料:
      ora-00600的[2662]和[4193]错误的解决:http://rchsh.itpub.net/post/8010/70741
      Oralce undo表空间管理与应用:http://space.itpub.net/15011739/viewspace-429479


链接:http://blog.sina.com.cn/s/blog_646e1e020100on6y.html

http://www.eygle.com/archives/2005/10/oracle_hidden_allow_resetlogs_corruption.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值