[DBA]断电异常后修复Oracle数据文件(ORA-00702: bootstrap verison)
首先,感谢网络时代及各位技术分享者,虽环境各有不同,提供了很多思路和技术点,让后来者更好的去实践。
环境:Windows2012 数据中心版,Oracle11.2.0.4 单机
问题:
启动数据库时,报如下错误
1
2
3
4
5
|
ORA-00704: bootstrap process failure ORA-00702: bootstrap verison '' inconsistent with version '8.0.0.0.0' Error 704 happened during db open , shutting down database USER (ospid: 189078): terminating the instance due to error 704 Instance terminated by USER , pid = 189078 |
问题背景:系统掉电,重启后就出现该问题。
警告日志也没太多参考信息,跟踪启动过程
--跟踪语句U如下
1
2
3
4
|
alter session set events '10046 trace name context forever,level 12' ; oradebug setmypid alter session set events '10046 trace name context forever,level 12' ; oradebug tracefile_name |
查看跟踪文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
--跟踪文件最后输出信息如下 EXEC #80694976:c=0,e=26374,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=867914364,tim=4808628360 WAIT #80694976: nam= 'db file sequential read' ela= 672 file#=1 block#=520 blocks=1 obj#=59 tim=4808629202 WAIT #80694976: nam= 'db file scattered read' ela= 815 file#=1 block#=521 blocks=3 obj#=59 tim=4808651345 FETCH #80694976:c=0,e=23124,p=4,cr=5,cu=0,mis=0,r=0,dep=1,og=4,plh=867914364,tim=4808651593 STAT #80694976 id=1 cnt=0 pid=0 pos=1 obj=59 op= 'TABLE ACCESS FULL BOOTSTRAP$ (cr=5 pr=4 pw=0 time=23124 us)' ORA-00704: ???????? ORA-00702: ?????? '' ??? '8.0.0.0.0' ??? ORA-00704: ???????? ORA-00702: ?????? '' ??? '8.0.0.0.0' ??? *** 2019-11-20 21:47:07.570 USER (ospid: 324): terminating the instance due to error 704 EXEC #80717456:c=203125,e=2024015,p=12,cr=6,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=4809376651 ERROR #80717456:err=1092 tim=4809376759 |
意思,创建完表 BOOTSTRAP$ 后,做扫描,出现问题,读块读到521。
检查下块520/521 属于什么对象(通过正常的数据库查询结果)
如上图,可以看到,对象 BOOTSTRAP$ 包括数据文件1的520-523块。
检查下该对象内容
如上图,可以看到版本显示,还可以看到一些创建其他对象的语句,也就是说,该表包含了OBJ$,C_OBJ$,TAB$等基表的创建语句,本次问题就是在创建完成后无法扫描该表,。其他基表无法创建报错
问题比较明显,就是 BOOTSTRAP$坏了,需要修复。通过dbv检查,并没有发现坏块,通过其他资料,可以尝试用bbed 复制一个好的 BOOTSTRAP$ 块到该数据文件下。
用dbca创建一个测试库(目的,平台、数据库版本一样),创建完毕后,备份system01.dbf 数据文件,删除该测试库。
使用bbed工具进行修复
需要注意的是,linux 、windows 数据文件块有区别,具体如下:
#windows
#linux
简单说明,就是windows 数据文件头是从块2开始(块1是系统标识,bbed无权查看),linux是从块1开始(块0 是系统标识)。
例如: 在数据库里识别的520,linux下 bbed 写 block 520,windows 需要写block 521.
此为windows平台,操作如下:
1
2
3
4
5
6
7
8
|
1 D:\bbed_df\SYSTEM01_new.DBF 20 D:\bbed_df\SYSTEM01.DBF set ORACLE_HOME=C:\app\Administrator\product\11.2.0\dbhome_1 bbed PASSWORD =blockedit mode=edit blocksize=8192 listfile=D:\bbed_win\bbed_1.txt copy file 1 block 521 to file 20 block 521 copy file 1 block 522 to file 20 block 522 copy file 1 block 523 to file 20 block 523 copy file 1 block 524 to file 20 block 524 |
如上图,我们检查的是 文件20 块 524, 验证时, 写的system01.dbf 的块标识是523。
注:bbed使用网络上一堆资料,Oracle11g已经不支持了,需要用Oracle10g甚至9i的一些相关包,可以保存备用,Windows毛病多,用的时候即使系统有环境变量,也需要再设置下ORACLE_HOME。
bbed 功能确实很强大,也是在没有备份情况下,很好的修复工具,这也是最后的尝试。
不论如何,建议定期备份,注意不是数据泵/exp方式,用rman,数据库太多,就采购备份软件,集中备份,万一出现,备份那点成本也就不算成本了。