love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

Oracle materizlized view Study (3)

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 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.