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的安全性也很重要。