环境:开发库 oracle 11.2.0.4 + suse linux 12
故障现象:巡检时发现,数据库已经挂掉。
处理过程:
查看alert日志,发现实例被终结了,且日志里面有如下报错:
Errors in file /srv/oracle/diag/rdbms/oracledb/oracledb/trace/oracledb_lgwr_29710.trc:
ORA-00316: log 1 of thread 1, type 0 in header is not log file
ORA-00312: online log 1 thread 1: '/opt/oradata/oracledb/redo01.log'
Errors in file /srv/oracle/diag/rdbms/oracledb/oracledb/trace/oracledb_lgwr_29710.trc:
ORA-00316: log 1 of thread 1, type 0 in header is not log file
ORA-00312: online log 1 thread 1: '/opt/oradata/oracledb/redo01.log'
LGWR (ospid: 29710): terminating the instance due to error 316
看报错信息,推断是 redo01.log文件损坏。
启库到mount阶段,查询日志文件状态。
select group#,thread#,archived,status from v$log;
很不幸,current redo中枪了。
对于该文件损坏,网上已经有了一套完整的处理方案:
1, pfile 开启隐藏参数 _allow_resetlogs_corruption
2,使用pfile 启动到 mount阶段,
recover database until cancel ;
alter database open resetlogs 试着打开数据库。 一般情况下,数据库可以被打开,不过是要报一些 ora-600 2662 错误。
3,使用数据泵导出数据库数据,这时会丢部分数据(也就是损坏日志中包含的数据,因为没有被检查点写入数据文件)
4,重建新库,导入数据。
通常来讲,上述办法是可行的,但是这里不行。下面是我的处理过程。
pfile 加入*._allow_resetlogs_corruption=true 参数,
startup mount;
alter database open resetlogs; --提示需要recover数据库