Oracle数据库ORA702和ORA943错误处理

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!  


故障现象


客户现场遇到数据库报错ORA-702,导致数据库宕机后无法启动,错误信息如下,




故障分析


数据库当前是关闭状态,使用startup到open状态时报错,当数据库在mount状态下时可以进行10046追踪设置,查看数据库启动时读取的文件信息。

=====================<br>PARSING IN CURSOR #80771912 len=55 dep=1 uid=0 oct=3 lid=0 tim=101660719872 hv=2111436465 ad='7ffb1daa1d60' sqlid='6apq2rjyxmxpj'<br>select line#, sql_text from bootstrap$ where obj# != :1<br>END OF STMT<br>PARSE #80771912:c=0,e=293,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=101660719872<br>BINDS #80771912:<br>Bind#0<br>oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00<br>oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0<br>kxsbbbfp=04d07700 bln=22  avl=02  flg=05<br>value=59<br>EXEC #80771912:c=0,e=504,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=867914364,tim=101660720449<br>WAIT #80771912: nam='db file sequential read' ela= 50 file#=1 block#=520 blocks=1 obj#=59 tim=101660720540<br>WAIT #80771912: nam='db file scattered read' ela= 133 file#=1 block#=521 blocks=3 obj#=59 tim=101660720751<br>FETCH #80771912:c=0,e=326,p=4,cr=5,cu=0,mis=0,r=0,dep=1,og=4,plh=867914364,tim=101660720798<br>STAT #80771912 id=1 cnt=0 pid=0 pos=1 obj=59 op='TABLE ACCESS FULL BOOTSTRAP$ (cr=5 pr=4 pw=0 time=326 us)'
查看日志,在读取文件1(即system.dbf)的520号、521号块发生错误,涉及到4个块520号到523号块,对应的数据库对象是bootstrap$,该表是数据库的启动引导表,表里的内容都是核心基表的创建语句。




故障处理


数据库当前无备份无归档,通过错误搜索,只能通过BBED来对数据块进行修复,因为启动引导表的内容是不会变化的,所以通过块拷贝将正常数据库的系统文件拷贝到当前无法启动的数据库系统文件。

这里获取正常数据库的系统文件是通过创建新的数据库实例来完成,BBED操作如下:

C:UsersAdministrator>bbed PASSWORD=blockedit mode=edit blocksize=8192 listfile=E:appAdministratororadatabbedsystembbfiles.txt<br>BBED: Release 2.0.0.0.0<br><strong><strong><strong><strong><strong><strong>* !!! For Oracle Internal Use only !!! ***</strong></strong></strong></strong></strong></strong><br>BBED> info all<br>File# Name Size(blks)<br>----- ---- ----------<br>1 E:appAdministratororadataorcl2SYSTEM01.DBF 0<br>30 E:appAdministratororadatabbedsystemSYSTEM0101.DBF 0
第一次操作是将报错的4个块进行覆盖拷贝到无法打开的数据库系统文件中:

BBED>copy file 30 block 520 to file 1 block 520<br>BBED>copy file 30 block 521 to file 1 block 521<br>BBED>copy file 30 block 522 to file 1 block 522<br>BBED>copy file 30 block 523 to file 1 block 523<br>BBED>sum apply
修改完成后,尝试启动数据库,数据库报错ORA-943错误:

ORA-00704: 引导程序进程失败<br>ORA-00943: 簇不存在<br>Error 704 happened during db open, shutting down database
报错cluster 不存在,其实查看bootstrap$中的数据,很多创建cluster模式对象的语句,此时怀疑是拷贝的块有问题导致,或者说不完整,通过查看正常实例上表占用的块数量,在WINDOWS上是占用8个数据块,再对数据文件进行处理,将8个块都拷贝覆盖。

BBED>copy file 30 block 520 to file 1 block 520<br>BBED>copy file 30 block 521 to file 1 block 521<br>BBED>copy file 30 block 522 to file 1 block 522<br>BBED>copy file 30 block 523 to file 1 block 523<br>BBED>copy file 30 block 524 to file 1 block 524<br>BBED>copy file 30 block 525 to file 1 block 525<br>BBED>copy file 30 block 526 to file 1 block 526<br>BBED>copy file 30 block 527 to file 1 block 527<br>BBED>sum apply
至此,通过上面步骤完成后,数据库可以正常启动。
END



本文作者:孙其成 (上海新炬中北团队)

本文来源:“IT那活儿”公众号