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

简介: 场景: 触发刷新的场景有: 1.刚开始对数据库进行的初始化刷新 2.一个commit 3.根据一个预定计划的job来对物化视图进行刷新 问题的场景,是通过一个预定的计划来对物化视图做刷新操作。

场景:

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




相关文章
|
6月前
|
JavaScript
弹框下次触发时还保留上次的触发条件
弹框下次触发时还保留上次的触发条件
|
6月前
|
安全 算法 数据管理
DMS问题之刷新删除还显示如何解决
DMS(Data Management Service)是阿里云提供的一站式数据管理服务,支持数据开发、维护、治理等多种功能;本合集着重于介绍DMS的功能特点、操作流程和最佳实践,帮助用户高效进行数据管理和维护。
107 11
|
消息中间件 架构师 数据处理
处理数据时点按钮,数据完数据时会自动执行的问题
处理数据时点按钮,数据完数据时会自动执行的问题
|
Android开发 索引
【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )
【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )
514 0
【RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )
|
前端开发
一个“保存”按钮同时存在“增删改”三种操作,该如何去实现?
一般情况下,对表格中的数据进行“增删改”操作,都是直接操作数据库。现在有些项目因为设计或者优化的缘故,不对表格中的数据进行“增删改”,而是通过最后“保存”按钮的操作,一次性将数据传至服务器,由服务器对数据进行“增删改”。 以下通过给用户分配角色这样的功能进行说明。
1598 0
|
关系型数据库 数据库 PostgreSQL
分享一个批量增加和移除用户对表的操作权限函数
最近一直有人在QQ群询问怎么设置一个用户对所有表的读权限等有关一次性对数据库或某个模式下所有表增加或移除某一个权限问题
2369 0
|
SQL 数据安全/隐私保护 索引
物化视图自动刷新的碰壁
今天和开发的同事讨论一个问题,他们说source 1的环境中存在一个表,现在希望目标环境target 1和target 2中都需要用到这部分的数据。 对于这个问题看似处理也比较常规。
892 0
|
SQL 监控 Oracle
物化视图刷新失败导致日志表异常增大
整理自:http://blog.itpub.net/231499/viewspace-63714/ 今天在检查时,发现某个物化视图日志占用的空间超过150M,再检查看,该物化视图日志表的记录数有150W,由于其对应的物化视图没有会刷新一次,结合业务量分析可知:物化视图日志不能正常清除。
1434 0