【问题标题】:Create Oracle Materialized View to be refreshed every 5 minute Using materialized view log创建每 5 分钟刷新一次的 Oracle 物化视图 使用物化视图日志
【发布时间】:2017-04-12 10:20:43
【问题描述】:

我正在尝试创建每 5 分钟自动更新一次的物化视图,我需要根据 Mview 日志表进行更新。

我在 TABLE1 TABLE1.SQL Script 上创建了物化视图日志

CREATE MATERIALIZED VIEW LOG ON TABLE1;   -- MLOG$_TABLE1

然后我创建了物化视图

CREATE MATERIALIZED VIEW JIBO_MVIEW 
REFRESH START WITH SYSDATE NEXT SYSDATE +5/24/60 
ENABLE QUERY REWRITE AS
      SELECT O.ID
            ,O.DATETIME_CREATED
            ,O.ORIGINATOR
            ,O.DETAILS
            ,O.PAYMENT_REF
        FROM TABLE1 O
       WHERE O.ORIGINATOR LIKE '53%';

在TABLE1中改变一些值后,插入新的记录MLOG$_TABLE1日志表

但更改的值不会在实体化视图 (JIBO_MVIEW) 中更新。 (即使在一天之后:))

当我在警报日志中检查时,自动生成的 DBMS_JOB 存在问题,每次执行都会失败。

 - ORA-12012: error on auto execute of job 4263
 - ORA-00942: table or view does not exist
 - ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2809
 - ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3025
 - ORA-06512: at "SYS.DBMS_IREFRESH", line 689
 - ORA-06512: at "SYS.DBMS_REFRESH", line 195 - 
 - ORA-06512: at line 1

但如果我手动执行作业,它就可以正常工作。这是代码示例

BEGIN DBMS_REFRESH.REFRESH('"JIBO"."JIBO_MVIEW"');
COMMIT;
END; 

然后我向用户添加了新的授权

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW TO JIBO; 
GRANT CREATE ANY TABLE TO JIBO WITH ADMIN OPTION;
GRANT UNLIMITED TABLESPACE TO JIBO;
GRANT SELECT ON SCHEMA1.MLOG$_TABLE1 TO JIBO WITH GRANT OPTION;
GRANT ALL ON SCHEMA1.TABLE1 TO JIBO WITH GRANT OPTION;

现在我在作业自动执行时收到此错误

 - ORA-12012: error on auto execute of job 4287
 - ORA-01031: insufficient privileges
 - ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2809
 - ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3025
 - ORA-06512: at "SYS.DBMS_IREFRESH", line 689
 - ORA-06512: at "SYS.DBMS_REFRESH", line 195
 - ORA-06512: at line 1

请指导我解决这个问题。 这个问题是由于错误地创建了物化视图,还是由于 oracle 中的某些参数应该打开?

【问题讨论】:

  • 起初网站一切正常,可能更改的记录不符合WHERE O.ORIGINATOR LIKE '53%' 条件。
  • 我在实体化视图 (JIBO_MVIEW) 中有记录,但在更改源表 (TABLE1) 中的值后该记录没有变化。
  • 您现在看到 MLOG$_TABLE1 中的记录了吗?
  • 你的例子对我有用。但是我必须填写一些关于原始表和值的详细信息。它可能有助于创建一个完全可重现的测试用例,这样我们就可以完全重新创建所有细节。此外,当您尝试使用以下代码手动刷新作业时会发生什么:begin dbms_refresh.refresh(user||'."JIBO_MVIEW"'); end; /?
  • 缺少用于创建 TABLE1 的脚本

标签: sql oracle view replication materialized


【解决方案1】:

我不确定,但问题可能在于 MV 的刷新作业创建。 试试这个查询。

select * from user_jobs where what like 'dbms_refresh.refresh%';BROKEN 列的值是多少?

select * from user_snapshot_refresh_times; 看到这个 select * from V$PARAMETER where name = 'job_queue_processes'参数值,是否可以,没有超出。

【讨论】:

  • 作业因故障而中断 (16),我重新创建了物化视图,没有更改源表 (TABLE1) 中的任何内容,但作业仍然失败。我应该在 V$PARAMETER 视图中检查哪个参数?
  • 您有多少用户工作,可能工作数量有问题,他们试图超过job_queue_processes 的值,然后您再添加一个?
  • 我的用户只有这个工作,但在数据库中还有很多其他工作。 select * from V$PARAMETER where name = 'job_queue_processes' 查询的结果 -------- > NUM 1872,NAME job_queue_processes,VALUE 20,DISPLAY_VALUE 20,ISDEFAULT FALSE,ISSES_MODIFIABLE FALSE,ISSYS_MODIFIABLE IMMEDIATE,ISINSTANCE_MODIFIABLE TRUE,ISMODIFIED FALSE,ISADJUSTED FALSE,ISDEPRECATED FALSE,ISB , 描述作业队列从属进程的最大数量, UPDATE_COMMENT ,HASH 1663833312
  • 我认为这个参数的问题,job_queue_processes 据我所知对于所有用户作业来说都是常见的,所以你的 oracle 实例只有 20 个作业可以运行,尝试增加 alter system set job_queue_processes = 1000。然后重新创建您的视图。
  • 我增加了限制,然后再次创建 mview,但作业仍然失败。
【解决方案2】:

您可以通过创建如下刷新组让 Oracle 自行管理刷新作业

exec DBMS_REFRESH.MAKE(name => 'MY_RG', list => 'JIBO_MVIEW', next_date => SYSTIMESTAMP, interval => 'SYSTIMESTAMP + Interval ''5'' minute');

之后,您可以使用检查刷新组的状态

select * from user_refresh;

【讨论】:

    【解决方案3】:

    您好,这里有一些一般性提示可以帮助您解决权限问题(表或视图不存在)。

    grant create any table, CREATE MATERIALIZED VIEW to MV_USER 其中 MV_USER 是 MATERIALIZED VIEW 的所有者。

    以相同的 MV_USER 身份连接。

    然后做你的 CREATE MATERIALIZED VIEW。

    要修复您的中断工作,请以 MV_USER(MV 的所有者)身份连接。

    然后运行:

    set serveroutput on size 1000000                                         
    declare                                                                  
    v_mview VARCHAR2(30);                                                    
    v_run   VARCHAR2(100);                                                
    v_job number;                                                            
    cursor user_mviews_c is                                                  
    select mview_name from user_mviews ;                                     
    cursor user_jobs_c is                                                    
    select job from user_jobs ;                                              
    begin                                                                    
    open user_mviews_c;                                                      
    loop                                                                     
       fetch user_mviews_c into v_mview;                                     
       exit when user_mviews_c%notfound;                                     
       v_run := 'exec DBMS_MVIEW.REFRESH ('''||v_mview||''',''C'');';        
       dbms_output.put_line(v_run);                                          
    end loop;                                                                
    close user_mviews_c;                                                     
    open user_jobs_c;                                                        
    loop                                                                     
       fetch user_jobs_c into v_job;                                         
       exit when user_jobs_c%notfound;                                       
       v_run := 'exec DBMS_JOB.RUN ('||v_job||');';                          
       dbms_output.put_line(v_run);                                          
    end loop;                                                                
    close user_jobs_c;                                                       
    end;                                                                     
    /                                                                        
    

    【讨论】:

    • 没用。
    • 你还会得到 ORA-00942 吗?
    • 不,现在我有另一个错误:ORA-12012: error on auto execute of job 4287 ORA-01031: insufficient privileges ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2809 ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3025 ORA-06512: at "SYS.DBMS_IREFRESH", line 689 ORA-06512: at "SYS.DBMS_REFRESH", line 195 ORA-06512: at line 1
    • ORA-01031: 权限不足
    • SYS 用户在我的 MV 用户上添加的赠款:GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW TO JIBO; GRANT CREATE ANY TABLE TO JIBO WITH ADMIN OPTION; GRANT UNLIMITED TABLESPACE TO JIBO; GRANT SELECT ON SCHEMA1.MLOG$_EBPP_PAYMENTS TO JIBO WITH GRANT OPTION; GRANT ALL ON RTPSEBPP.EBPP_PAYMENTS TO UFC_DAVITJ WITH GRANT OPTION;
    【解决方案4】:

    在类似的设置中,我已对下面的所有 sys 对象授予执行权限。也许这会解决你的问题。

    DBMS_DEFER_SYS,  
    DBMS_SNAPSHOT,  
    DBMS_SNAP_REPAPI,  
    DBMS_REPCAT_DECL,  
    DBMS_DEFER_QUERY,  
    DBMS_REPCAT_UTL,  
    DBMS_DEFER_INTERNAL_QUERY,  
    DBMS_DEFER_INTERNAL_SYS,  
    DBMS_REPCAT_UNTRUSTED,  
    DBMS_OFFLINE_SNAPSHOT,  
    DBMS_REPCAT,  
    DBMS_INTERNAL_REPCAT,  
    DBMS_REPCAT_RPC,  
    DBMS_RECTIFIER_DIFF,  
    DBMSOBJGWRAPPER,  
    DBMS_REPCAT_RGT,  
    DBMS_OFFLINE_OG 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 2015-07-31
      • 2012-07-04
      • 2016-06-14
      • 1970-01-01
      • 2014-04-24
      相关资源
      最近更新 更多