materialized view的fast和日誌分析和一則案例
物化檢視多使用者資料倉儲,資料複製等環境,自己接觸的還是主要是用於簡單的查詢,讓其利用所謂的空間換取時間,提高系統的效能。重新整理機制和查詢重寫是物化檢視最重要的功能。
下面結合自己碰到的一則物化檢視的ora處理來簡要說一下物化檢視和日誌和fast重新整理機制。
mview_tab01表是主表,下面的mv01是mview_tab01的物化檢視。先來看看下面的物化檢視日誌的表的結構。
SQL> alter table mview_tab01 add primary key(id);
Table altered
SQL> create materialized view log on mview_tab01;
Materialized view log created
SQL> create materialized view mv01
2 build immediate
3 refresh fast
4 start with sysdate
5 next sysdate+5/1440
6 enable query rewrite
7 as
8 select * from mview_tab01;
Materialized view created
SQL> insert into mview_tab01 values(5,'ORCL');
1 row inserted
SQL> commit;
Commit complete
SQL> col change_vector$$ for a10
SQL> col change_vector$$ for a10
SQL> select * from mlog$_mview_tab01;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VEC XID$$
---------- ----------- --------- --------- ---------- ----------
5 4000/1/1 I N FE 2815995307
SQL> insert into mview_tab01 values(8,'ORACLE');
1 row inserted
SQL> select * from mlog$_mview_tab01;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VEC XID$$
---------- ----------- --------- --------- ---------- ----------
5 4000/1/1 I N FE 2815995307
8 4000/1/1 I N FE 1.97036349
SQL> commit;
Commit complete
Dbms_mview.refresh重新整理一下物化檢視,然後再檢視物化檢視的日誌。
SQL> select * from mlog$_mview_tab01;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VEC XID$$
---------- ----------- --------- --------- ---------- ----------
物化檢視已經重新整理修改,且物化檢視的日誌也已經再次清空。
SQL> delete from mview_tab01 where id=8;
1 row deleted
SQL> select * from mlog$_mview_tab01;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VEC XID$$
---------- ----------- --------- --------- ---------- ----------
8 4000/1/1 D O 00 1.12602016
SQL> execute dbms_mview.refresh('MV01');
PL/SQL procedure successfully completed
SQL> select * from mlog$_mview_tab01;
ID SNAPTIME$$ DMLTYPE$$ OLD_NEW$$ CHANGE_VEC XID$$
---------- ----------- --------- --------- ---------- ----------
這裡注意一下mlog$_mview_tab01檢視的column的含義
SQL> desc mlog$_mview_tab01;
Name Type Nullable Default Comments
--------------- ----------- -------- ------- --------
ID NUMBER Y
SNAPTIME$$ DATE Y
DMLTYPE$$ VARCHAR2(1) Y
OLD_NEW$$ VARCHAR2(1) Y
CHANGE_VECTOR$$ RAW(255) Y
XID$$ NUMBER Y
上述是主鍵物化檢視的日誌,id主鍵,snaptime$$重新整理時間,dmltype$$表示dml操作型別,上述的I表示insert,d表示delete,change_vector$$修改向量,用於表示修改的欄位值是哪些,不過內部演算法比較複雜暫時不做深究。
如果是rowid和object的物化檢視日誌的檢視有少許不同,這裡就不列舉。
物化檢視之所以能fast refresh是利用檢視的日誌來傳遞資訊到物化檢視中更新,refresh前物化檢視會先根據基表是否發生變化,如果不發生變化,即使物化檢視日誌有記錄資訊,物化檢視也不會重新整理資料。
先讀取基表是否發生變化是refresh的第一步,然後才會傳遞日誌記錄到物化檢視重新整理資料。
今天碰到一則materialized view fast的案例,物化檢視無法重新整理,手動重新整理也出現下列錯誤。
SQL> execute dbms_mview.refresh('MV_ARTICLE');
BEGIN dbms_mview.refresh('MV_ARTICLE'); END;
*
ERROR at line 1:
ORA-12034: materialized view log on "DESKTOP"."ARTICLE" younger than last refresh
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2255
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2461
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2430
ORA-06512: at line 1
[oracle@server119 ~]$ oerr ora 12034
12034, 0000, "materialized view log on "%s"."%s" younger than last refresh"
// *Cause: The materialized view log was younger than the last refresh.
// *Action: A complete refresh is required before the next fast refresh.
根據物化檢視的重新整理機制會重新整理snaptime$$大於物化檢視上次refresh時間的記錄(上次refresh的時間可以檢視user_mviews等檢視),重新整理完成後將修改資料字典中last_refresh_date重新整理時間.下次refresh就會根據snaptime$$l來refresh上次的重新整理時間後的資料,也就是記錄到mlog$_mview_tab01的日誌記錄資訊,並清除已經refresh的snaptime$$的資訊記錄。
(不過上述的ora錯誤出現時,mlog檢視中會出現早於上次refresh的snaptime記錄,這個也是錯誤的進一步表象)
根據提示materialized view log比上次的article重新整理還早,那麼再次重新整理時要利用view log的,由於日誌snaptime$$早於上次refresh導致無法利用log重新整理,此種情況可以重建物化檢視或者完全重新整理來解決,多發生於對物化檢視和基表,物化檢視日誌做過相應的ddl操作引起。
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1058718/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Materialized ViewZedView
- 記錄一則clear重做日誌檔案的案例
- Oracle vs PostgreSQL Develop(20) - Materialized ViewOracleSQLdevZedView
- Java常用的日誌框架對比和分析Java框架
- linux檔案系統和日誌分析Linux
- 關於MySQL 通用查詢日誌和慢查詢日誌分析MySql
- Apach的配置和日誌
- mysql慢查詢和錯誤日誌分析MySql
- 使用Java和Elastic Stack進行日誌分析JavaAST
- 日誌分析-apache日誌分析Apache
- 在Linux中,有哪些日誌管理和分析工具?Linux
- Goroutine 和 Channel 的的使用和一些坑以及案例分析Go
- 跟我一起學docker(15)--監控日誌和日誌管理Docker
- 日誌分析一例
- 簡單分析MySQL 一則慢日誌監控誤報問題MySql
- [日誌分析篇]-利用ELK分析jumpserver日誌-日誌拆分篇Server
- Kubelet 錯誤日誌 broken pipe 和 connection reset by peer 的原因分析
- Spring Boot日誌的使用和配置Spring Boot
- 對一次 GC日誌的分析GC
- .netcore console 日誌和配置NetCore
- JAVA異常和日誌Java
- 故障分析 | 從一則錯誤日誌到 MySQL 認證機制與 bug 的深入分析MySql
- Kubernetes 叢集日誌 和 EFK 架構日誌方案架構
- lumen cli日誌和普通日誌分開儲存
- 在Linux中,如何使用ELK進行日誌管理和分析?Linux
- Netweaver和CloudFoundry的伺服器日誌Cloud伺服器
- Android進階:一、日誌列印和儲存策略Android
- MySQL之事務和redo日誌MySql
- Greenplum工具GPCC和GP日誌中時間不匹配的問題分析
- crash日誌分析
- FDOAGENT日誌分析
- 『無為則無心』Python日誌 — 65、日誌模組logging的使用Python
- 用python客戶價值分析案例一則Python
- eclipse設定檢視GC日誌和如何理解GC日誌EclipseGC
- 玄機-第二章日誌分析-apache日誌分析Apache
- SpringBoot指定日誌檔案和日誌Profile功能Spring Boot
- ABAP webdynpro的view navigation和WebUI的view navigationWebViewNavigationUI
- 11.日誌和事務@Transactional
- MySQL鎖(四)行鎖的加鎖規則和案例MySql