通常我们在服务器上做了硬件层面的Raid之后,用户拔掉任意一块硬盘,系统仍然能够正常工作。
不巧的是,某些情况下,由于疏忽大意,往往会造成意外的发生,今天就遇到了客户同时拔掉了奇偶校验的两块硬盘,而且是CMS的生产服务器,包括Oracle数据库【OMG!】
在ssh的终端直接抛出了一个io error后,整个CentOS系统就崩溃了,不接受任何指令,包括reboot,
倒是tomcat竟然还能工作,这里小赞许一下,但好像servlet也不行了。
到机房直接断电重启,系统已经无法启动。服务器反复加载硬件,到硬盘这一步时,始终过不去,提示error。
按系统提示输入C键,进入Raid阵列管理,发现已经有两块磁盘Offline,badluck!
尝试将磁盘设置为Online,发现没有相关选项。
……经过IBM工程师一番折腾之后,操作系统总算恢复正常。但Oracle好像有点不太对头:
启动Oracle出现如下错误提示:
ORA-01113: file 3 needs media recovery
ORA-01110: data file 3: '/oracle/app/oradata/orcl/sysaux01.dbf'
按照提示要求执行:
sql >recovery datafile 3;
提示修复成功
但重启数据库后,在startup.log中又抛出如下错误:
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [4194], [49], [24], [], [], [], [],
看样子,Oracle在尝试回滚最近的数据时,遇到了麻烦。
OK,稀里糊涂搜索一通后,得到了一个相近的答案:
重建UNDO
SQL> startup mount
ORACLE instance started.
Total System Global Area 599785472 bytes
Fixed Size 1220772 bytes
Variable Size 125833052 bytes
Database Buffers 465567744 bytes
Redo Buffers 7163904 bytes
Database mounted.
SQL> create undo tablespace undotbs02 datafile '/home/u01/app/oracle/oradata/orcl/undotbs02.dbf' size 100m
2 ;
create undo tablespace undotbs02 datafile '/home/u01/app/oracle/oradata/orcl/undotbs02.dbf' size 100m
*
ERROR at line 1:
ORA-01109: database not open
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/home/u01/app/oracle/oradata/orcl/system01.dbf
/home/u01/app/oracle/oradata/orcl/undotbs01.dbf
/home/u01/app/oracle/oradata/orcl/sysaux01.dbf
/home/u01/app/oracle/oradata/orcl/users01.dbf
SQL> alter database datafile '/home/u01/app/oracle/oradata/orcl/undotbs01.dbf' offline drop;
Database altered.
SQL> alter database open;
Database altered.
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 1056
Current log sequence 1058
SQL> create undo tablespace undotbs2 datafile '/home/u01/app/oracle/oradata/orcl/undotbs02.dbf' size 100m;
Tablespace created.
SQL> ALTER SYSTEM SET undo_tablespace='UNDOTBS2' ;
System altered.
通过以上设置,再次重启数据库,ok,一切恢复正常!
由此得出一个重要教训:服务器上的东西不要随便插入拔出
[此文在实际操作过程中发现日志中仍然存在警告,有异常,5个小时后,Oracle再次停掉]
【建议重新安装Oracle,Oracle修复过于复杂,除非有重要数据,不建议继续修复】