多個物化檢視導致物化日誌無法及時更新

luckyfriends發表於2014-07-21

文章版權所有 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部落格 ” ,連結:http://blog.itpub.net/14710393/viewspace-1223503/,如需轉載,請註明出處,否則將追究法律責任。

相關文章