Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1984374
  • 博文数量: 176
  • 博客积分: 1857
  • 博客等级: 上尉
  • 技术积分: 2729
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-14 22:55
个人简介

吾生有涯,而知无涯,适当止学.循序渐进,步步提升 Talk is cheap, show me the code.

文章分类

全部博文(176)

文章存档

2019年(1)

2018年(14)

2017年(20)

2016年(31)

2015年(15)

2014年(5)

2013年(10)

2012年(80)

分类: Oracle

2013-10-18 15:22:30

场景:

触发刷新的场景有:
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。




阅读(7113) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~