ITPub博客

首页 > 数据库 > Oracle > 多个物化视图导致物化日志无法及时更新

多个物化视图导致物化日志无法及时更新

原创 Oracle 作者:luckyfriends 时间:2014-07-21 11:18:59 1 删除 编辑

文章版权所有 Jusin Hao(luckyfriends) ,支持原创,转载请注明

CREATE MATERIALIZED VIEW LOG ON ANALYZE_LOG TABLESPACE "TEST"
WITH ROWID, SEQUENCE INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW ANALYZE_LOG1 REFRESH FAST WITH ROWID ON DEMAND
AS SELECT * FROM ANALYZE_LOG;

CREATE MATERIALIZED VIEW ANALYZE_LOG2 REFRESH FAST WITH ROWID ON DEMAND
AS SELECT * FROM ANALYZE_LOG;

测试1)

SQL> exec analyze_tb; --执行存储过程使日志表里有数据

PL/SQL procedure successfully completed

clip_image002

SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --执行第一个物化视图刷新,时间戳变更

PL/SQL procedure successfully completed

clip_image004

SQL> exec dbms_mview.refresh('ANALYZE_LOG2','F'); --执行第二个物化视图刷新,日志中的数据刷新过去了

clip_image006

测试2)

SQL> exec analyze_tb; --执行存储过程使日志表里有数据

clip_image008

SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --执行第一个物化视图刷新,时间戳变更

clip_image010

SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --再执行第一个物化视图刷新,日志并不能刷新过去了

clip_image012

测试3)

SQL> exec analyze_tb; --执行存储过程使日志表里有数据

clip_image014

SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --执行第一个物化视图刷新,时间戳变更

clip_image016

SQL> exec analyze_tb; --再次执行存储过程使日志表里有数据,日志表数据增行

clip_image018

SQL> exec dbms_mview.refresh('ANALYZE_LOG2','F'); --执行第二个物化视图刷新,第一次存储过程产生的日志数据被刷新过去了,而第二次执行存储过程产生的日志数据时间戳变更

clip_image020

SQL> exec dbms_mview.refresh('ANALYZE_LOG2','C'); --执行第二个物化视图的完全刷新,日志数据还是不能刷新过去

clip_image022

SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --执行第一个物化视图的刷新,日志数据才刷新过去

clip_image024

结论

如果重做刷新过程中没有将原来做过的物化视图日志清除,然后在新服务器上直接新建物化视图做的,将会导致一个物化视图日志对应了多个物化视图(而对应物化视图之前的已不再刷新),那么这将会导致日志无法清除等待所有物化视图刷新后才能清除,事实上这已经是不可能的了因为不刷新的物化视图都已经不在了

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14710393/viewspace-1223503/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: bug:8575528
请登录后发表评论 登录
全部评论
长期从事IT相关工作。

注册时间:2009-06-06

  • 博文量
    465
  • 访问量
    3307414