案例:redo损坏利用隐藏参数强制open报错ORA-07445

本案例来自西区某客户,数据库版本为11.2.0.1,由于redo损坏需要通过隐藏参数“_allow_resetlogs_corruption”=true来强制open数据库,但是在启动过程中,报错ORA-07445。具体报错为:

通过10046跟踪open过程:

发现报错的sql为update undo$,在读取1号文件541号文件之后开始报错。

1号文件的block 541是undo block,我们知道system表空间只有一个undo段为system。该block属于system undo段的一个undo块,那么update undo$为什么会去访问这个undo块呢?

第一种可能性是需要undo块构造一致性读,但是用bbed读取了几个块,发现在推进了scn的情况下并不需要undo块来构造一致性读,那么这很可能与为事务分配undo块有关,当事务绑定undo段之后,会从undo段头块的free block pool中去获取undo块。

可以看到system undo段的free block pool中存在1个块,rdba为0x0040021d,正好就是1号文件541号块,那么处理该问题就非常简单了,清空free block pool,让system undo段重新分配undo块即可。

修改之后重新启动数据库成功。

over!!!

此条目发表在Oracle, Oracle Recover分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注