首批通过分布式安全可靠测评,为关键业务系统打造
物化视图日志概述
更新时间:2025-06-20 17:11:38
物化视图日志(Materialized View Log,mlog)用于记录用户表(基表)的增量更新数据,以支持物化视图的快速刷新功能。mlog 是一个记录表,追踪基表的变化,并将这些变化应用于相应的物化视图,实现快速刷新。
使用限制
只能在普通用户表上创建物化视图日志,无法在其他类型的表上创建。
一张基表只与一个物化视图日志做绑定。
在创建物化视图日志时,如果基表正在运行事务,则创建操作将被阻塞,直到该事务结束。
物化视图日志暂不支持
LOB列。物化视图日志暂不支持以下四种类型的数据:JSON、XML、GIS 和 UDT。
物化视图日志暂不支持生成列(包括虚拟列和非虚拟列)。
物化视图日志暂不支持指定分区,其分区和基表的分区是绑定关系。
物化视图日志的名称长度上限与普通表相同,不能超过 64 个字符。由于物化视图日志的名称会加上
mlog$_前缀,因此创建物化视图日志的基表名称不能超过 58 个字符。物化视图日志不支持表级恢复。
物化视图日志在单独删除时不会进入回收站。
物化视图日志在创建后不支持
ALTER操作。物化视图日志上不支持建立索引。
物化视图日志不支持进行 DML 操作,会报错。
使用权限
- 创建物化视图日志需要对基表的
SELECT权限和CREATE TABLE的权限。 - 删除物化视图日志需要
DROP TABLE的权限。 - 物化视图日志只能赋予
SELECT权限,不支持其他的 DML 操作。
物化视图日志 Schema 定义
一个表只能有一个物化视图日志,其 Schema 名称为 mlog$_table,其中 table 为基表的名称。
物化视图日志的 Schema 定义如下:
| 列名 | 类型 | 说明 |
|---|---|---|
| sequence$$ | in64_t | 自增列,为物化视图日志(mlog)的主键列。
说明mlog 的主键由基表的主键、所有分区键(如果存在)以及自增列 |
| primary key | 跟随基表 | 基表是有主键表时,mlog 中会记录基表的主键列(如果是复合主键,则会包含多列)。 |
| dmltype$$ | char(1) | 记录 DML 类型。有三种取值,I、D 和 U,分别表示 INSERT、DELETE 和 UPDATE。 |
| old_new$$ | char(1) | 用于 UPDATE 语句中标记旧值和新值,UPDATE 一行会往物化视图日志中写入两行数据,一行是 UPDATE 前的旧值,另一行是 UPDATE 后的新值,分别用 O 和 N 进行标记。 |
| column 1 | 跟随基表 | 基表普通列 1。 |
| ... | N/A | N/A |
| column N | 跟随基表 | 基表普通列 N。 |
| ora_rowscn | N/A | 伪列,记录在存储层的一个隐藏列中,可以读取。 |
| m_row$$ | uint64_t | 基表是无主键表时,mlog 中才会记录该值。mlog 中必须包含基表的主键列。如果基表是无主键表,那么基表隐藏主键的名称在 mlog 中的名称为 M_ROW$$。 |
操作已有的物化视图日志
- 您可以直接查询物化视图日志所在的 Schema 的结构和其中的数据。
- 您可以通过 DBMS_MVIEW.PURGE_LOG(table_name) 来对某个基表的物化视图日志执行
PURGE操作。 - 如果物化视图日志的大小增长到超过可用的磁盘容量,将会报错。此时,您必须先删除该物化视图日志并重新创建,才能继续使用它。
基表操作对物化视图日志的影响
基表 DML 操作
物化视图日志表的定义就是负责记录对基表 DML 操作,因此对基表进行 INSERT、DELETE 和 UPDATE 操作最终都会记录到物化视图日志中,具体如下:
- 对基表进行
INSERT操作,则插入的每行数据也会生成一条记录插入在物化视图日志中;该记录的dmltype$$列值为I,old_new$$列值为N。 - 对基表进行
DELETE操作,则删除的每行数据也会生成一条记录插入在物化视图日志中;该记录的dmltype$$列值为D,old_new$$列值为O。 - 对基表进行
UPDATE操作,则修改的每行数据也会生成两条记录插入在物化视图日志中;第一行记录的是被UPDATE行的旧值,dmltype$$列值为U,old_new$$列值为O;第二行记录的是UPDATE后的新值,dmltype$$列值为U,old_new$$列值为N。
基表 DDL 操作
在删除基表之前,需要先删除相应的物化视图日志,否则会报错,因为物化视图日志与基表有一一绑定关系,所以不支持直接删除基表只保留物化视图日志。
更多有关基表支持的 DDL 操作信息,请参见 Online DDL 和 Offline DDL 操作。