首页 > 数据库 > Oracle > 多个物化视图导致物化日志无法及时更新
文章版权所有 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
SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --执行第一个物化视图刷新,时间戳变更
PL/SQL procedure successfully completed
SQL> exec dbms_mview.refresh('ANALYZE_LOG2','F'); --执行第二个物化视图刷新,日志中的数据刷新过去了
测试2)
SQL> exec analyze_tb; --执行存储过程使日志表里有数据
SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --执行第一个物化视图刷新,时间戳变更
SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --再执行第一个物化视图刷新,日志并不能刷新过去了
测试3)
SQL> exec analyze_tb; --执行存储过程使日志表里有数据
SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --执行第一个物化视图刷新,时间戳变更
SQL> exec analyze_tb; --再次执行存储过程使日志表里有数据,日志表数据增行
SQL> exec dbms_mview.refresh('ANALYZE_LOG2','F'); --执行第二个物化视图刷新,第一次存储过程产生的日志数据被刷新过去了,而第二次执行存储过程产生的日志数据时间戳变更
SQL> exec dbms_mview.refresh('ANALYZE_LOG2','C'); --执行第二个物化视图的完全刷新,日志数据还是不能刷新过去
SQL> exec dbms_mview.refresh('ANALYZE_LOG1','F'); --执行第一个物化视图的刷新,日志数据才刷新过去
结论
如果重做刷新过程中没有将原来做过的物化视图日志清除,然后在新服务器上直接新建物化视图做的,将会导致一个物化视图日志对应了多个物化视图(而对应物化视图之前的已不再刷新),那么这将会导致日志无法清除等待所有物化视图刷新后才能清除,事实上这已经是不可能的了因为不刷新的物化视图都已经不在了
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14710393/viewspace-1223503/ ,如需转载,请注明出处,否则将追究法律责任。