1、环境

OS:sun solaris

Database version:8.1.7

数据文件存放路径:/u01/oradata/bjtb/; /u02/oradata/bjtb/

数据库为非归档

2、问题

raid5坏两个盘,oracle的文件存放路径/u01,/u02都挂不上

更换硬盘后,/u01可挂上,/u02仍然不可以

/u02中存放的文件有:8个普通的数据文件,全部的redo日志文件

3、处理过程

$sqlplus / as sysdba失败
$sqlplus /nolog
Sql>conn / as sysdba成功

Sql>startup失败,无法mount

Alert文件中显示其中一个控制文件在/u02下

Vi$ORACLE_HOME/dbs/initbjtb.ora

删掉/u02下的控制文件的路径,仅保留另外两个控制文件即可

Sql>shutdown immediate

Sql>startup可以mount,但是有数据文件在/u02上,因此无法打开数据库

Sql>alter database backup controlfile to trace;

Udump下查看生成的trace文件,发现一半的数据文件都在/u02下,全部redo也在/u02下

还好这些都是普通的数据文件,offline后数据库应该是可以起来的,只是会丢掉很多数据。尝试恢复。

Sql>alter database open;

报数据文件3找不到

Sql>alter database datafile 3 offline drop;

根据提示,offline drop掉的数据文件有3,4,6,7,10,13,14,15

Sql>alter database open;

报redo日志找不到

Sql>alter database rename file ‘/u02/oradata/bjtb/redo01.log’ to ‘/u02/oradata/bjtb/redo01.log’;

报新文件’/u02/oradata/bjtb/redo01.log’找不到

尝试在重建控制文件的脚本中修改此路径,重建控制文件失败。于是

$touch /u02/oradata/bjtb/redo01.log
$touch /u02/oradata/bjtb/redo02.log
$touch /u02/oradata/bjtb/redo03.log
Sql>alter database rename file ‘/u02/oradata/bjtb/redo01.log’ to ‘/u02/oradata/bjtb/redo01.log’;
Sql>alter database rename file ‘/u02/oradata/bjtb/redo01.log’ to ‘/u02/oradata/bjtb/redo02.log’;
Sql>alter database rename file ‘/u02/oradata/bjtb/redo01.log’ to ‘/u02/oradata/bjtb/redo03.log’;

成功

Sql>alter database open;

报错:需要resetlogs或resetlogs

Sql>alter database open resetlogs;

报错:需要介质恢复

Sql>recover database until cancel;

Cancel

需要更多恢复,文件system01.dbf错

4、分析

因为故障的原因是掉电引起的,因此,导致了有些看起来是好的文件,它的checkpoint也不一致,如果日志信息还存在,那么还有可能通过日志中的记录把文件的checkpoint一致,但是,我们的redo log全部丢失,而且数据库还是在noarchivelog模式下,无法让它的checkpoint一致,数据库无法打开。只能通过备份恢复,而且还必须是完全备份。

5、建议

此次问题最大的原因在于同时有两块硬盘损坏,因此对于系统的硬件,也需要定期做检查。

数据库方面,建议最好将数据库设置成归档模式,而且需要定期对数据库备份、维护。

对于redo log,每个日志组最好有两个成员,并且两个成员分别放在不同的目录下。目前我们的redo log的三个日志组,每个日志组都是一个成员。单一redo log的丢失或损坏故障很容易恢复,但是如果碰到像我们现在的情况:断电故障,非归档,日志全部丢失。在这种情况下,如果不幸断电时有文件的checkpoint不一致,那么就没有办法将其写一致,只能靠备份恢复了。所以,redo log的安全性也很重要。