troubleshooting ORA-00600: internal error code, arguments: [kpdbIsObjectStorePdb]

近日,某客户的一套生产库19c CDB无法启动,该CDB有17个PDB,可见影响面还是挺大的,数据库open的时候报错如下:

600错误的kpdbIsObjectStorePdb,我是第一次遇到,并且在google和mos搜索了一圈,没有一篇文档有关于这个错误的信息。不过多年的oracle深入学习,早就造就了一身分析未知问题的身手,例如之前的一个案例http://www.minniebaby.tech/2022/06/02/%e6%a1%88%e4%be%8b%ef%bc%9atroubleshooting-ora-00600-internal-error-code-arguments-25015-when-drop-tablespace/

看到kpdbIsObjectStorePdb函数,首先大概猜测一下这个函数到底啥意思

看着大概是判断是否是PDB容器的意思,具体分析方法还是老办法,oracle的利器10046

报错源头定位:

原来kpdbIsObjectStorePdb函数是通过select c.obj#, c.con_id#, o.name from container$ c, obj$ o where c.obj# = o.obj#去判断的,熟悉10046的人应该很容易看出结果返回了18行,不是17个pdb吗???

继续分析10046,分析了两条重要线索

存在一个叫NON$CDB的PDB,因为fetch的r=1,说明这个sql用这些bind值返回了1行数据

这个NON$CDB的OBJ#很可能就是385936

这里可以根据10046读取的block,bbed看block,也可以mount下面dump block分析,我采用的是600错误自己生成errorstack里面的blockdump

这个PDB在OBJ$的I_OBJ5 索引上确实存在,下面是container$的blockdump,从命名来看确实多了一条

这不是CDB吗?怎么会有一条NON$CDB??? 可能是ORACLE用于判断是否是CDB的。找了一个正常的CDB数据库10046 open跟踪

确实都会做这一步检查,但是正常的CDB环境返回是0(r=0),那么问题就很清楚了,解决方法就是删除container$和obj$的obj#=385936的记录

删除方法有很多,可以bbed去改,这里需要改index又要改表,还不止一个表和索引,很麻烦,这里想到了之前分析oracle open的过程阶段性的重要函数

oracle open大致核心过程:

  • kcfopd:open begin
  • kcvcrv:oracle open一致性检查,如果需要则进行crash recovery中的SMON: enabling cache recovery
  • kqlblfc:bootstrap以及字典完整性检查,这部分任何一个地方有报错,则会报ORA-00704 bootstrap process failure
  • ktuini:undo初始化以及修改undo$的undo段状态
  • kturRecoverUndoSegment:扫描undo段是否有活动事务
    ktusmiut_init_ut->ktusmout_online_ut->ktusmous_online_undoseg->ktusmOnlineUndoSegments->ktusmOnlineOneSegment->ktuOnlineUndoSegment online undo segment
  • ktcCommitTxn:开始crash recovery中的SMON: enabling tx recovery
  • kokiasg:数据字典校验

这个case明显已经到了数据字典校验阶段了,那么在报错函数kpdbIsObjectStorePdb打上断点,就可以进库里面去删除了

然后再次重启数据库,绕过了这个错误,后续虽然还有报错都是非常简单的一些报错了,比如常见的ORA-01209

最后回归问题本身,为什么会多出一条NON$CDB的记录呢?翻看之前的alert,发现有人重建了控制文件,并且只写了root cdb的数据文件,很可能是oracle判断是NON-CDB然后自己写入的(猜测),真是够乱来的。

很久没有碰oracle了,目前也只有恢复数据库能让我碰一下了,这个错误ORA-00600 kpdbIsObjectStorePdb没有遇到过也没搜到过,也算全网首发了,记录一下

over!!!

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

发表回复

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