love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

How to recreate Bootstrap Index(I_OBJ1,I_USER1,I_FILE#_BLOCK#) to fix ORA-00701 ?

在上一篇数据恢复文章中,我提到了bootstrap 核心数据数据字典表的对象index出现异常后,难以修复。实际上,仅仅是数据不一致(或类似的情况)导致的index异常,其实有其他的方式进行重建。实际上Oracle 11gR2版本中的如下脚本提供了相关的解决方案:$ORACLE_HOME/rdbms/admin/utlmmig.sql. 虽然该脚本的的解决方法是针对从10g升级到11gR2出现异常后的处理方式,然而该脚本中的内容,却值得我们深入研究

几年前之前也写过一篇通过bbed来修复bootstrap 核心对象的例子:bootstrap$核心对象数据不一致导致ORA-08102

这里以上篇文章中提到的2个index 为例进行说明:

 

 

根据utlmmig.sql的处理思路,我们很容易进行仿制,如下。

—创建table

 

 

—创建需要修复的Index

 

 

—Prepare the bootstrap sql text for the new objects

 

 

—Copy data from old tables to the new tables.

 

 

—处于性能考虑,更新表的统计信息

—新旧表/index 进行交换

—-删除bootstrap$mig中的旧数据

—-将新对象插入到bootstrap$mig中

—-处理依赖关系和权限

—-将Swap bootstrap$mig 和 bootstrap

上述脚本关键的一点是借助了dbms_ddl_internal.swap_bootstrap,而swap_bootstrap 这个存储过程在11g中才存在。
而我这里是10g的环境,因此无法使用该存储过程。不过这里可以换个方法,Oracle在open的时候是通过读取system数据文件头的offset 96的root dba来获取bootstrap$ 的段头地址,然后完成bootstrap 对象的创建过程

因此我们这里通过bbed 手工修改这里的root dba地址即可,这样的效果跟使用swap_boostrap的效果一样

—-重启数据库即可

步骤略.

 

Leave a Reply

You must be logged in to post a comment.