如何取消一个正在做刷新操作的物化视图

本文介绍了如何通过预定计划刷新Oracle中的物化视图,并提供了查看计划中的job、检查当前运行刷新状态的方法,以及如何取消刷新操作并避免job重新调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:

触发刷新的场景有:
1.刚开始对数据库进行的初始化刷新
2.一个commit
3.根据一个预定计划的job来对物化视图进行刷新


问题的场景,是通过一个预定的计划来对物化视图做刷新操作。

点击(此处)折叠或打开

  1. CREATE MATERIALIZED VIEW TESTMV
  2.   NOLOGGING
  3.   BUILD DEFERRED
  4.   REFRESH COMPLETE ON DEMAND
  5.   NEXT trunc(sysdate + 1,'dd') + (1/24)
  6. AS
  7.   SELECT * FROM EMP;

提示:NEXT的语法会制定物化视图在凌晨一点钟执行刷新操作。
如果job失败的话,job子系统会再次执行它。
这将会导致一个场景,系统会变得很忙,总是想完成这个刷新操作,特别是物化视图比上述所说的还要复杂的时候、

解决方案:

以下的sql语句可以知道哪些job是在当前被计划中的:


点击(此处)折叠或打开

  1. COLUMN JOB HEADING 'Job ID' FORMAT 999999
  2. COLUMN PRIV_USER HEADING 'Privilege|Schema' FORMAT A10
  3. COLUMN RNAME HEADING 'Refresh|Group|Name' FORMAT A10
  4. COLUMN ROWNER HEADING 'Refresh|Group|Owner' FORMAT A10
  5. COLUMN BROKEN HEADING 'Broken?' FORMAT A7

  6. SELECT J.JOB,
  7. J.PRIV_USER,
  8. R.ROWNER,
  9. R.RNAME,
  10. J.BROKEN
  11. FROM DBA_REFRESH R, DBA_JOBS J
  12. WHERE R.JOB = J.JOB
  13. ORDER BY 1;
你的输出会看到跟如下相似的结果:


  1. Refresh Refresh
  2.         Privilege Group Group
  3. Job ID Schema Owner Name Broken?
  4. ------- ---------- ------------ ---------- -------
  5. 26 SCOTT SCOTT TESTMV N
上述会显示你要的Job id号和对应的物化视图名称。Broken这一列表示job是否考虑继续执行,一个已经broken的job是不会继续执行的。


再根据job id号,看看下面又发生了什么


  1. col last_date format a10
  2. col last_sec format a10
  3. col next_sec format a10
  4. col interval format a20
  5. col what format a30
  6. col what broken a10

  7. select job,last_date, last_sec,
  8.        total_time,next_date,next_sec,what,interval,broken
  9.    from DBA_JOBS
  10.    where job=n;
最后,通过下面的语句,看看哪个job是当前正在运行的

  1. SELECT * FROM V$MVREFRESH

你会看到相似的输出:

  1. Session Serial Materialized
  2. Identifier Number Owner View
  3. ---------- ------- --------------- -------------------------
  4. 19 233 SCOTT TESTMV

这个例子说明被scott用户所拥有的物化视图TESTMV正在被刷新中,你可以执行下面的语句取消当前回话的刷新操作。

  1. ALTER SYSTEM KILL SESSION 19,233;

下面是干货,会话failed之后,job会重新的re-schedule的刷新操作

为了防止这个情况的发生,你需要在取消操作之前先mark一下broken,让job不再re-scheuled。

通过以下的操作,操作的用户是MV的拥有者,而不是sysdba


  1. sqlplus scott/tiger(这个用户是你实际运行的用户)
  2. SQL> BEGIN
  3.        DBMS_JOB.BROKEN ( n, true);
  4.        commit;
  5.        END;
  6.        /
注意:n对应的是你的job id号。

现在可以重新测试一下job是否为broken了:


  1. Refresh Refresh
  2.         Privilege Group Group
  3. Job ID Schema Owner Name Broken?
  4. ------- ---------- ------------ ---------- -------
  5. 26 SCOTT SCOTT TESTMV Y
你可以执行以下操作删除当前的进程:

  1. ALTER SYSTEM KILL SESSION 19,233;

这个刷新操作再也不会发生,除非你又重新标记job为"not broken",想如下所做:

  1. sqlplus scott/tiger
  2. SQL> BEGIN
  3.        DBMS_JOB.BROKEN ( n, false);
  4.        commit;
  5.        END;
  6.        /
删除物化视图本身也会移走job队列中的job。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值