一次物化视图刷新问题排查

问题现象:

客户反馈,有两个物化视图,刷新条件均为refresh fast on demand,即手动刷新或者使用job等定时刷新。且物化视图1因为job异常关系目前无法正常刷新,但是物化视图2没有手工刷新,在job中也没有看到相关信息,但是却在正常刷新,客户觉得这很诡异,需要确认下是什么原因导致。

(具体物化视图语句这里不做展示)


分析排查

  1. 检查物化视图日志

    select log_owner,master,log_table from dba_mview_logs;

    查询物化视图日志是否有数据

    均正常

  2. 检查job信息,确认是都有job定时刷新ZX_CARD_BASEINFO

     select schema_user,last_date,interval,WHAT from dba_jobs;

   

   可以看到物化视图1,但没有发现涉及到刷新ZX_CARD_BASEINFO的job。

  (此前已经确认操作系统层面没有定时调度任务)


    3.观察 ZX_CARD_BASEINFO的刷新规律

         确认ZX_CARD_BASEINFO刷新时间间隔为5分钟

       定位到相同执行时间的job

     

      怀疑ZX_CARD_BASEINFO存在于CARD_REFRESH刷新组中。

   

    4.查看刷新组信息

      select owner,name,rowner,rname,job from dba_refresh_children;

     

      确认ZX_CARD_BASEINFO是由于job定时刷新刷新组才能定期刷新的。


     至此,可以确定两个相同刷新条件的物化视图,物化视图1是由于定时job异常所以没有正常刷新,物化视图2 是因为在刷新组中,且该job在正常执行,所以物化视图2可以正常执行,不存在什么灵异现象。



扩展

--查看刷新组信息。

SQL> select rowner,rname,job,next_date,interval from dba_refresh;


--查看刷新组子信息,包含具体的物化视图

SQL> select owner,name,rowner,rname,job from dba_refresh_children;


--新建一个刷新组
begin 
DBMS_REFRESH.MAKE ( 
        name => 'zmy.rep_refresh', 
        list => '', 
        next_date => SYSDATE, 
        interval => 'SYSDATE + 1/24', 
        implicit_destroy => FALSE, 
        rollback_seg => '', 
        push_deferred_rpc => TRUE, 
        refresh_after_errors => FALSE); 
end;
--添加MV到一个刷新组
begin 
DBMS_REFRESH.ADD(
    name => 'rep_refresh',
    list => 'zmy.testmv'
    );
end;
/
--更改刷新组的刷新间隔
begin 
DBMS_REFRESH.CHANGE(
    name => 'rep_refresh',
    next_date => sysdate,
    interval => sysdate+(1/(24*60))
    );
end;
/
--手动刷新一个刷新组
SQL> exec DBMS_REFRESH.REFRESH('rep_refresh');                                                                                                                                        
--从刷新组中移除一个物化视图
begin
DBMS_REFRESH.SUBTRACT (
   name => 'zmy.rep_refresh',
   list => 'zmy.testmv'
   );
end;
/                                                                                                                                        
--移除所有的物化视图并删除刷新组
exec DBMS_REFRESH.DESTROY('rep_refresh');        










请使用浏览器的分享功能分享到微信等