love wife love life —Roger的Oracle/MySQL數據恢復博客

Phone:18180207355 提供專業Oracle/MySQL數據恢復、性能優化、遷移升級、緊急救援等服務

Oracle materizlized view Study (3)

本站文章除注明轉載外,均為本站原創: 轉載自love wife love life —Roger的Oracle/MySQL數據恢復博客

本文鏈接地址: Oracle materizlized view Study (3)

+++++++ 詳解物化視圖日志

前面講了物化視圖日志創建的幾種方式,這里詳細講解關于物化視圖日志相關的一些東西,例如如何維護。
物化視圖日志,簡單一點講,就是其記錄了基表所有的dml變化,然后在刷新時也是根據物化視圖日志來
進行掃描的,在刷新完成以后,物化視圖日志里面的信息會被清空。但是高水位線不會降低。

我們這里的基表是T1,在你創建物化視圖日志的時候,oracle會自動將其命名為mlog$_基表名的形式。
下面我們來看看這個物化視圖日志的結構是怎么樣的?

—— 下面我們來操作一條數據來進行觀察

下面來分別描述這幾個列的具體含義:
object_id: 這一列是10g以后新增加的,是你的前面創建物化視圖指定的主鍵列。如果你的主鍵是id,那么這里列名也是id。
SNAPTIME$$:記錄刷新操作的時間
DMLTYPE$$:記錄DML的類型,主要有幾種,分別是i(insert)、d(delete)、u(update)
OLD_NEW$$:記錄更新的列的值是之前old值(O),還是更新后新的new值(n).當然,如果是update的話,則是U。
CHANGE_VECTOR$$: 記錄dml操作發生的字段

例如:

Oracle采用的方式就是用每個BIT位去映射一個列。

比如:第一列被更新設置為02,即00000010。第二列設置為04,即00000100,第三列設置為08,即00001000。
當第一列和第二列同時被更新,則設置為06,00000110。如果三列都被更新,設置為0E,00001110。

所以上面這里這里查詢結果02就表示第1列。

從上面可以看出,物化視圖日志的的包含的列可能有:主鍵列。rowid,sequence,object或指明的某列。實際上就是
創建物化視圖日志的幾種方式。

既然物化視圖和物化視圖日志都是實實在在存在的對象,那么我們來看看其結構跟普通的數據表是否完全一樣。

可以看到物化視圖block和物化視圖日志的block結構跟普通的數據塊完全一樣,沒有任何不同。
我們知道物化視圖在完成刷新以后,日志是會被清理掉的。這里有個疑問了?如果日志很大那么
必須回影響性能,如果你長時間的刷新,那么也比如會導致物化視圖日志的高水位線很高。

下面我們來看一個實現復制功能的物化視圖日志的情況:

我們可以看到物化視圖日志高水位并不會降低,只會增大,甚至可能比物化視圖本身還大。

降低物化視圖日志高水位的穩妥方式還建議使用move,如下:

說明:其實在源端,還有一個比較重要的表也記錄mv相關的信息,不過這個對象是在sys下面。

最后還要一個簡單的問題,突然想到的,那就是關于mview log的清理,我如何知道什么時候才能清理呢?如果清理時間點
不對,那么豈不是會影響刷新嗎? 判斷的依據就是mlog$_NAME.SNAPTIME$$和sys.slog$.SNAPTIME;

關于前面使用move或truncate 物化視圖日志表,我在一篇mos文檔上看到了如下一個 標準的步驟:

1) LOCK TABLE scott.emp IN EXCLUSIVE MODE; –基表
2) CREATE TABLE scott.templog AS SELECT * FROM scott.mlog$_emp; –另外一個session
3) TRUNCATE TABLE scott.mlog$_emp;
4) INSERT INTO scott.mlog$_emp SELECT * FROM scott.templog;
drop table scott.mlog$_emp;
5) ROLLBACK;

注意:Any changes made to the master table between the time you copy the rows
to a new location and when you truncate the log do not appear until after you
perform a complete refresh. Then it is better to truncate the MView log when it
is empty. Only the owner of a MView log or a user with the DELETE ANY TABLE
system privilege can truncate a mview log.

note: How To Truncate Materialized View Log [ID 457070.1]

最后補充一句,不管是move還是shrink 操作針對物化視圖日志,都可以參考上面這個方法,保證里面沒有數據,
不然很可能會丟失數據的。

2 Responses to “Oracle materizlized view Study (3)”

  1. tony Says:

    能不能不用???? bbed啊 ,唉

  2. A Journey from Oracle to MS SQL Server – Brendan Codes Says:

    […] see why in a moment). It has to have the same fields as the real?SYS.MLOG$ table, which I found on this page but have listed here for […]

Leave a Reply

You must be logged in to post a comment.

百度彩票APP