暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

快来看,oracle数据字典损坏原来可以这样修复。


01
快来看,oracle数据字典损坏原来可以这样修复。


引言,事情是这样的,用户准备在生产库导出数据,在创建目录过程中报ORA-00600 [16201错误],在未远程的情况下,我简单查询了下mos和百度,没有发现什么可参考的文章,第一感觉是数据库组件或者基表存在问题。通过最后的分析,确实是基表存在问题,经过简单分析和处理后不再报错。



02
排查问题经过


1)查看dba_registry无问题。

2)查看无效对象,没有关于系统相关的。

--通过上面排查,排除数据字典问题。

3)创建其它名字的目录,居然可以,也能够删除。到这里我基本上可以判断数据库数据字典有问题了。

4)我使用hcheck.sql检查数据字典,确实发现了问题,报错如下:




03
处理方式


01.脚本让我去查询mosid为:1360518.1的文章,文章里面建议我联系专业的人员解决,没有参考意义。

02.人工分析该sql文件的脚本,找到如下过程:

--

  Procedure MissingDir$

           (nF      In Number  Default 0,

            VerChk  In Number  Default 5,

            Verbose In Boolean Default FALSE)

  Is

    Cursor sCur1 Is

      select o.obj# o_obj, o.owner# o_owner, o.name o_name, d.obj# d_obj,

             oa.grantee# oa_grantee, oa.privilege# oa_priv, u.name u_name

      from    sys.obj$ o,  sys.dir$ d,  sys.objauth$ oa, sys.user$ u

      where  o.obj# = d.obj# (+)

      and    o.obj# = oa.obj# (+)

      and    o.owner# = u.user#

      and    o.type# = 23

      and    d.obj# is null

      and    decode(bitand(o.flags, 196608),

              65536, 'METADATA LINK', 131072, 'OBJECT LINK', 'NONE') = 'NONE';

    nFr  Number;

    ps1  Varchar2(10) := 'HCKE-0013';

    ps1a Varchar2(65) := 'DIR$ entry missing for directory objects';

    ps1n Varchar2(40) := '(Doc ID 1360518.1)';

    CursorRun Boolean := FALSE;

  Begin

    If ( nF = 0) Then

      nFr := FindFname('MissingDir$') ; Else nFr := nF;

    End If ;

      

    If ChecknCatVnFR (nCatV, nFr, VerChk) = FALSE Then Return; End If;

      

    For c1 in sCur1 Loop

      If (not CursorRun) Then

          report_failure('FAIL',ps1,ps1a,ps1n,CursorRun);

      End If;

      put_line(' OBJ$ OBJ#='||c1.o_obj||' Owner='||c1.u_name||'.'||

             c1.o_name||' - Grantee('||c1.oa_grantee||') - Priv ('||

             c1.oa_priv||')');

      Fatal := Fatal + 1;

    End Loop ; 

    If (CursorRun) Then put(chr(10)) ; else put_line('PASS'); End If ;

  End;


03.通过对过程进行分析,发现dir$基表数据存在缺失,反复比对后将缺失的数据insert进去解决,处理后再次检测正常。

insert into sys.dir$ select obj#,'--------------------------------------','E:\hisbak' from sys.obj$ where obj# in(87135,87759,87760,183953,193347,193424,193443);

commit;



微信号:Oray_123






文章转载自数据库技术加油站,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论