Oracle数据库REDO日志损坏恢复处理
最近有很多重要的事情要处理,更不巧的是网第数据处理服务器因掉电导致Oracle无法正常启动,因而导致网第最新排名数据迟迟没有发布。刚把一些重要的事情处理完毕,得以抽时间来解决Oracle数据库问题。经过一天半时间的处理,电话咨询了一位Oracle数据库专家,终于把问题彻底搞定。在此把解决方法记录下来:
1)查找问题症状
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日的数据表。
到目前为止,数据运算仍在正常运行中。
参考资料:
ora-00600的[2662]和[4193]错误的解决:http://rchsh.itpub.net/post/8010/70741
Oralce undo表空间管理与应用:http://space.itpub.net/15011739/viewspace-429479
-- 命令符下启动Oracle net start OracleDBConsoleorcl C:\>lsnrctl start |
参考资料:
链接:http://blog.sina.com.cn/s/blog_646e1e020100on6y.html
http://www.eygle.com/archives/2005/10/oracle_hidden_allow_resetlogs_corruption.html