Oracle数据库ORA702和ORA943错误处理

2023年 12月 7日 61.7k 0

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

故障现象

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

故障分析

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

=====================
PARSING IN CURSOR #80771912 len=55 dep=1 uid=0 oct=3 lid=0 tim=101660719872 hv=2111436465 ad='7ffb1daa1d60' sqlid='6apq2rjyxmxpj'
select line#, sql_text from bootstrap$ where obj# != :1
END OF STMT
PARSE #80771912:c=0,e=293,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=101660719872
BINDS #80771912:
Bind#0
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
kxsbbbfp=04d07700 bln=22  avl=02  flg=05
value=59
EXEC #80771912:c=0,e=504,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=867914364,tim=101660720449
WAIT #80771912: nam='db file sequential read' ela= 50 file#=1 block#=520 blocks=1 obj#=59 tim=101660720540
WAIT #80771912: nam='db file scattered read' ela= 133 file#=1 block#=521 blocks=3 obj#=59 tim=101660720751
FETCH #80771912:c=0,e=326,p=4,cr=5,cu=0,mis=0,r=0,dep=1,og=4,plh=867914364,tim=101660720798
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$,该表是数据库的启动引导表,表里的内容都是核心基表的创建语句。

通过定为对象和报错信息,可以断定是数据库system数据文件出现损坏,而损坏的对象是数据库的启动引导表。

故障处理

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

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

C:UsersAdministrator>bbed PASSWORD=blockedit mode=edit blocksize=8192 listfile=E:appAdministratororadatabbedsystembbfiles.txt
BBED: Release 2.0.0.0.0
************* !!! For Oracle Internal Use only !!! ***************
BBED> info all
File# Name Size(blks)
----- ---- ----------
1 E:appAdministratororadataorcl2SYSTEM01.DBF 0
30 E:appAdministratororadatabbedsystemSYSTEM0101.DBF 0

第一次操作是将报错的4个块进行覆盖拷贝到无法打开的数据库系统文件中:

BBED>copy file 30 block 520 to file 1 block 520
BBED>copy file 30 block 521 to file 1 block 521
BBED>copy file 30 block 522 to file 1 block 522
BBED>copy file 30 block 523 to file 1 block 523
BBED>sum apply

修改完成后,尝试启动数据库,数据库报错ORA-943错误:

ORA-00704: 引导程序进程失败
ORA-00943: 簇不存在
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
BBED>copy file 30 block 521 to file 1 block 521
BBED>copy file 30 block 522 to file 1 block 522
BBED>copy file 30 block 523 to file 1 block 523
BBED>copy file 30 block 524 to file 1 block 524
BBED>copy file 30 block 525 to file 1 block 525
BBED>copy file 30 block 526 to file 1 block 526
BBED>copy file 30 block 527 to file 1 block 527
BBED>sum apply

至此,通过上面步骤完成后,数据库可以正常启动。
END

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

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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论