以下场景针对的是日志组中所有的redo log都已经损坏。
场景一: inactive 日志组损坏,
假如日志组 4 损坏,状态 inactive。解决很简单,重建日志组即可
SQL> alter database clear logfile group 4; 这里 clear 的意思是重建 group4 的文件。
场景二: current 日志组损坏
本例日志组 1 状态是 CURRENT 状态的,现在模拟当前日志组损坏
[oracle@prod]$ rm /u01/oradata/prod/redo01.log
[oracle@prod]$ rm /u01/disk2/prod/redo01b.log
SQL> alter system switch logfile; 切换几次,触动它一下。
告警日志会记录有关信息
暂时好像没有什么问题发生,继续切换,当 current 又转会到 group1 时,session 死!
当前日志损坏的问题比较复杂,可以分以下几种情况讨论
1)数据库没有崩溃
第一步,可以做一个完全检查点,将 db buffer 中的所有 dirty buffer 全部刷新到磁盘上。
SQL> alter system checkpoint;
第二步,尝试数据库在打开状态下进行不做归档的强制清除。
SQL> alter database clear unarchived logfile group n;
数据库此时为打开状态,这步若能成功,一定要做一个新的数据库全备,因为当前日志无法归档,归档日志 sequence 已无法保持连续性。全备的目的就是甩掉之前的归档日志。
2)数据库已经崩溃,只能做传统的基于日志的不完全恢复或使用闪回数据库。
SQL> recover database until cancel;
SQL> alter database open resetlogs;
3)如果之前没有可用的备份,或问题严重到任何方法都不能 resetlogs 打开数据库,为了抢救数据,考虑最后一招使用 Oracle的隐含参数:_allow_resetlogs_corruption=TRUE
Oracle 不推荐使用这个隐含参数
该参数的含义是:允许数据库在不致性的情况下强制打开数据库。_
在不一致状态下强行打开了数据库后,建议做一个逻辑全备。
场景三: active 日志组损坏
做检查点切换,如成功,按照 inactive 损坏处理。否则,按 current 损坏处理。