active或者current状态的redo文件损坏
<p>redo日志常规情况下有3中状态:inactive、active或current,inactive损坏不会丢失数据,但是active或current一般会造成数据丢失。</p>
<p>查看redo的状态:
SQL>select group#,status from v$log;</p>
<h1>inactive状态的日志损坏inactive状态的日志损坏导致数据库起不来</h1>
<p>直接将对应的redo日志删除即可
SQL> alter database drop logfile group 1;
Database altered.
SQL> alter database open;
Database altered.</p>
<p>备注,如果该联机日志还未完成归档,需使用如下命令删除
SQL>alter database clear unarchived logfile group 3;</p>
<h1>active、current状态的日志损坏导致数据库起不来</h1>
<p>这种情况下,需要设置隐含参数“_allow_resetlogs_corruption”强制打开数据库(数据库会处于不一致状态),如下:</p>
<ol>
<li>
<p>确定所有数据文件都不处于备份状态
SQL> select 'alter database datafile '''||name||''' end backup;' from v$datafile;
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4a4366c2c0f84b9f5321c962e64be9d8&amp;file=file.png" alt="" /></p>
</li>
<li>
<p>设置隐含参数,并重启到mount状态
SQL>alter system set "_allow_resetlogs_corruption"=TRUE scope=spfile;
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=bccc31f5506157575e1082cfdc85bd13&amp;file=file.png" alt="" /></p>
</li>
<li>使用open resetlogs方式强制打开数据库
SQL>alter database open resetlogs;</li>
</ol>
<p><strong>注意事项</strong></p>
<ol>
<li>如果open resetlogs打开时提示需要进行恢复,可以使用recover database until cancel,然后输入所有可用的归档日志和联机日志,然后输入cancel取消恢复操作,再重新使用alter database open resetlogs方式打开数据库。</li>
<li>将隐含参数去掉,重新打开数据库</li>
<li>由于数据库中数据处于一种不一致状态,因此数据库打开后,需要立即进行全库导出和恢复</li>
<li>建议使用 ANALYZE TABLE…VALIDATE STRUCTURE CASCADE 命令检查数据一致性(其它可以检查数据一致性的工具也可以)</li>
<li>由于是强制方式(不一致方式)打开数据库,因此数据库发生故障前,未提交的数据可能被标记为提交状态</li>
<li>强制打开数据库的过程中可能会遭遇其它ORA-600错误,如果第一个参数未400N,可能与回滚段有关,可再MOS查找解决方法,一一解决启动过程中遇到600错误,最后打开数据库,或者是2662,与SCN有关。</li>
<li>如果时间允许,最好保留现场(将数据文件进行一次备份)</li>
</ol>
<p><strong>备注</strong>
rac中一个节点(至少一个节点存活)的日志文件(active、current)丢失,处理方式如下:
1.关闭所有实例
2.在受损实例上,启动到mount状态
3.执行alter database open resetlogs命令
4.如果需要,先用recover database until cancel 命令模拟一次不完全恢复
5.实例启动成功后,启动其他实例
6.立即对数据库进行一次全备份</p>