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

来源:这里教程网 时间:2026-03-03 19:49:11 作者:

问题现象:客户反馈,有两个物化视图,刷新条件均为refresh fast on demand,即手动刷新或者使用job等定时刷新。且物化视图1因为job异常关系目前无法正常刷新,但是物化视图2没有手工刷新,在job中也没有看到相关信息,但是却在正常刷新,客户觉得这很诡异,需要确认下是什么原因导致。(具体物化视图语句这里不做展示) 分析排查

    检查物化视图日志select log_owner,master,log_table from dba_mview_logs; 查询物化视图日志是否有数据 均正常

    检查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');        

相关推荐