IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    物化视图刷新报错ora-920(或ora-904)

    小荷发表于 2015-09-30 10:04:02
    love 0

    某物化视图在增量刷新的时候报错ora-00920,尝试全量刷新的时候,报错ora-00904。

    BEGIN
    DBMS_MVIEW.REFRESH('MV_ABCD_K_PPLLCJ','F');
    END;
     
    ORA-12018:在创建"MYJUKKA"."MV_ABCD_K_PPLLCJ"的代码时出现以下错误
    ORA-00920:无效的关系运算符
    ORA-06512:在"SYS.SNAPSHOT", line 2809
    ORA-06512:在"SYS.SNAPSHOT", line 3025
    ORA-06512:在"SYS.SNAPSHOT", line 2994
    ORA-06512:在line 1
     
    SQL>
    BEGIN
    DBMS_MVIEW.REFRESH('MV_ABCD_K_PPLLCJ','C',ATOMIC_REFRESH=>false);
    END;
     
    ORA-12018:在创建"MYJUKKA"."MV_ABCD_K_PPLLCJ"的代码时出现以下错误
    ORA-00904:标识符无效
    ORA-06512:在"SYS.SNAPSHOT", line 2809
    ORA-06512:在"SYS.SNAPSHOT", line 3025
    ORA-06512:在"SYS.SNAPSHOT", line 2994
    ORA-06512:在line 1
     
    SQL>

    查了mview的定义,直接select是没有问题,再查了mos,也没有查到相关的文档或bug,所以,决定做10046看看报错究竟出在哪里。

    在10046的trace文件中,我们找到了相关报错:

    PARSE ERROR #47436954909072:len=1055 dep=1 uid=147 oct=3 lid=147 tim=1442993043265145 err=920
    SELECT DISTINCT LOG$."POLNO" FROM (SELECT MLOG$."POLNO" "POLNO" FROM "MYJUKKA"."MLOG$_ZYX_ABCD_K_PPLLCJ" MLOG$ WHERE "SNAPTIME$$" > :1 AND ("DMLTYPE$$"!='I')) LOG$ WHERE (LOG$."POLNO") NOT IN
    (SELECT MAX_TAB$."POLNO" "POLNO" FROM (SELECT "ZYX_ABCD_K_PPLLCJ"."POLNO" "POLNO","ZYX_ABCD_K_PPLLCJ"."PARTY_NO" "PARTY_NO" ...(snip)... WHERE SYS_AUDIT (CASE WHEN 1=1 THEN 1 ELSE NULL END,'MYJUKKA','ZYX_ABCD_K_PPLLCJ','MYPOLICY',3) IS NUL) "MAS_TAB$$"
    WHERE LOG$."POLNO" = MAS_TAB$."POLNO")
    ...
    EXEC #47436954884200:c=1063838,e=5655639,p=6341,cr=10165,cu=802,mis=0,r=0,dep=0,og=1,plh=0,tim=1442993043266925
    ERROR #47436954884200:error=12018 time=1442993043266991

    这个语句,我们直接去执行的时候,也是报错ora-920的。具体的报错是在SYS_AUDIT上,发现这个字段是放在where后面进行过滤,但是其表ZYX_ABCD_K_PPLLCJ是没有这个字段的。

    另外,这个语句,所涉及到的表是ZYX_ABCD_K_PPLLCJ,而表ZYX_ABCD_K_PPLLCJ是MV_ABCD_K_PPLLCJ物化视图的基表。

    所以,MV_ABCD_K_PPLLCJ物化视图的基表是ZYX_ABCD_K_PPLLCJ,而ZYX_ABCD_K_PPLLCJ在物化视图刷新时,执行了select ZYX_ABCD_K_PPLLCJ where SYS_AUDIT(case when)语句,而SYS_AUDIT字段并不存在ZYX_ABCD_K_PPLLCJ表,所以就报错ora-920了。

    从名字看audit好像和审计有关,查了各种审计,发现在ZYX_ABCD_K_PPLLCJ上有FGA的细粒度审计,对ZYX_ABCD_K_PPLLCJ表的select操作进行记录。

    由于SYS_AUDIT应该是在FGA审计的过程中产生,我在测试环境中,尝试刷新MV_ABCD_K_PPLLCJ表,在刷到一半的途中ctrl+c中断,再次刷新也报错了。因此怀疑一开始的报错是否也是被意外中断导致。

    解决方法:disable FGA的审计策略,在全量刷新或者增量刷新,无报错。再enable FGA,问题解决。

    进一步查询发现,Bug 18173440 – ORA-12018 / ORA-904 executing DBMS_MVIEW.REFRESH (Doc ID 18173440.8)



沪ICP备19023445号-2号
友情链接