首批通过分布式安全可靠测评,为关键业务系统打造
物化视图日志
更新时间:2026-04-07 20:57:20
物化视图日志(Materialized View Log,mlog)用于记录基表(普通表或物化视图)的增量更新数据,以支持物化视图的快速刷新功能。mlog 是一个记录表,追踪基表的变化,并将这些变化应用于相应的物化视图,实现快速刷新。
如果开启物化视图日志自动管理功能,那么在创建增量刷新物化视图或实时物化视图时,OceanBase 数据库会自动创建 mlog 或自动更新 mlog 定义。
说明
对于 V4.3.5 版本,从 V4.3.5 BP4 版本开始支持物化视图日志自动管理功能,详细信息,参见 物化视图日志自动管理。
使用限制
只能在普通表和物化视图上创建物化视图日志。
一张基表只与一个物化视图日志做绑定。
在创建物化视图日志时,如果基表正在运行事务,则创建操作将被阻塞,直到该事务结束。
物化视图日志支持 LOB 类型的列,但是仅支持 LOB 数据内联存储。有关 LOB 类型的介绍信息,参见 LOB 类型。
注意
对于 OceanBase 数据库 V4.3.5 版本,物化视图日志从 V4.3.5 BP1 版本开始支持 LOB 类型的列。
物化视图日志暂不支持以下四种类型的数据:JSON、XML、空间数据和 UDT。
物化视图日志暂不支持生成列(包括虚拟列和非虚拟列)。
物化视图日志暂不支持指定分区,其分区和基表的分区是绑定关系。
物化视图日志的名称长度上限与普通表相同,不能超过 64 个字符。由于物化视图日志的名称会加上
mlog$_前缀,因此创建物化视图日志的基表名称不能超过 58 个字符。物化视图日志不支持表级恢复。
物化视图日志在单独删除时不会进入回收站。
物化视图日志在创建后不支持
ALTER操作。物化视图日志上不支持建立索引。
物化视图日志不支持进行 DML 操作,会报错。
使用权限
- 创建物化视图日志需要对基表的
SELECT权限和CREATE TABLE的权限。 - 修改物化视图日志需要对基表的
ALTER权限。 - 删除物化视图日志需要
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 操作。
创建物化视图日志
说明
OceanBase 数据库 mlog 暂时不支持指定分区(Partition),mlog 的 Partition 和基表的 Partition 是绑定关系。
权限要求
创建物化视图日志需要有 CREATE TABLE 和基表的 SELECT 权限。更多有关 OceanBase 数据库权限的详细介绍,请参见 Oracle 模式下的权限分类。
语法
创建物化视图日志的 SQL 语句格式如下:
CREATE [OR REPLACE] MATERIALIZED VIEW LOG ON [schema.] table_name
[parallel_clause]
[with_clause]
[mv_log_purge_clause];
参数说明:
OR REPLACE:可选项,指定OR REPLACE表示如果对应的mlog已经存在,则根据定义创建一个新的mlog,用新的mlog替换原有的mlog。重新创建mlog过程中不会影响物化视图和基表的正常读写。说明
对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP3 版本开始支持
OR REPLACE参数。table_name:指定物化视图日志对应的基表名称。parallel_clause:可选项,用于指定物化视图日志清理的并行度。with_clause:可选项,指定物化视图日志中包含的辅助列。mv_log_purge_clause:可选项,指定物化视图日志中数据的清除时间。
有关创建物化视图日志语法的详细参数说明信息,请参见 CREATE MATERIALIZED VIEW LOG。
示例如下:
创建表
tbl1。CREATE TABLE tbl1 (col1 NUMBER, col2 VARCHAR2(20), col3 NUMBER, PRIMARY KEY(col1, col3)) PARTITION BY HASH(col3) PARTITIONS 10;在
tbl1表上创建物化视图日志。指定并行处理物化视图日志的并行度为5和物化视图日志记录col2列的变更信息,并且会记录变更前后的新值;配置物化视图日志从当前日期开始,每隔1天清理一次过期的物化视图日志记录。CREATE MATERIALIZED VIEW LOG ON tbl1 PARALLEL 5 WITH SEQUENCE(col2) INCLUDING NEW VALUES PURGE START WITH current_date NEXT current_date + 1;查看表
tbl1上物化视图日志的信息。DESC mlog$_tbl1;返回结果如下:
+------------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +------------+--------------+------+------+---------+-------+ | COL1 | NUMBER | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(20) | YES | NULL | NULL | NULL | | COL3 | NUMBER | NO | PRI | NULL | NULL | | SEQUENCE$$ | BIGINT(20) | NO | PRI | NULL | NULL | | DMLTYPE$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | OLD_NEW$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | +------------+--------------+------+------+---------+-------+ 6 rows in set
修改物化视图日志
说明
对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP1 版本开始支持修改物化视图日志。
权限要求
执行 ALTER MATERIALIZED VIEW LOG 语句,需要当前用户拥有基表的 ALTER 权限。更多有关 OceanBase 数据库权限的详细介绍,请参见 Oracle 模式下的权限分类。
语法
修改物化视图日志的 SQL 语句格式如下:
ALTER MATERIALIZED VIEW LOG ON [schema.]table_name alter_mlog_action_list;
alter_mview_action_list:
alter_mlog_action [, alter_mlog_action ...]
alter_mlog_action:
parallel_clause
| PURGE [[START WITH expr] [NEXT expr]]
parallel_clause:
NOPARALLEL
| PARALLEL integer
参数说明:
schema.:可选项,指定物化视图日志基表所在的 Schema。如果省略schema.,则默认基表在当前会话所在的 Schema 中。table_name:指定物化视图日志对应的基表名称。alter_mlog_action_list:表示可以对物化视图日志执行修改的操作列表。可以同时指定多个操作,使用英文逗号(,)分隔。
有关修改物化视图日志语法的详细参数说明信息,请参见 ALTER MATERIALIZED VIEW LOG。
示例如下:
创建表
test_tbl1。CREATE TABLE test_tbl1 (col1 NUMBER PRIMARY KEY, col2 VARCHAR2(20), col3 NUMBER, col4 BLOB);在
test_tbl1表上创建物化视图日志。CREATE MATERIALIZED VIEW LOG ON test_tbl1 WITH SEQUENCE(col2, col3, col4) INCLUDING NEW VALUES;修改表
test_tbl1上物化视图日志的并行度为 5。ALTER MATERIALIZED VIEW LOG ON test_tbl1 PARALLEL 5;修改表
test_tbl1上物化视图日志从当前日期开始,每隔1天清理一次过期的物化视图日志记录。ALTER MATERIALIZED VIEW LOG ON test_tbl1 PURGE START WITH current_date NEXT current_date + 1;
删除物化视图日志
注意事项
- 删除物化视图日志时,如果基表正处于某个运行的事务中,则直到该事务结束前,删除操作都会阻塞。
- 单独删除物化视图日志的时候,物化视图不会进入回收站。
权限要求
删除物化视图日志需要有 DROP TABLE 权限。更多有关 OceanBase 数据库权限的详细介绍,请参见 Oracle 模式下的权限分类。
语法
删除物化视图日志的 SQL 语句格式如下:
DROP MATERIALIZED VIEW LOG ON [schema.] table;
参数说明:
schema.:可选项,指定物化视图日志基表所在的 Schema。如果省略schema.,则默认基表在您自己的 Schema 中。table:指定物化视图日志对应的基表名称。
示例如下:
删除表 tbl1 上的物化视图日志。
DROP MATERIALIZED VIEW LOG ON tbl1;
示例
本示例将展示如何创建普通表、物化视图日志、增量刷新的物化视图,并且介绍如何删除物化视图日志以及增量刷新物化视图的操作信息。
创建表
test_tbl1。CREATE TABLE test_tbl1 (col1 INT PRIMARY KEY, col2 INT, col3 INT);在
test_tbl1表上创建物化视图日志,指定使用序列号(SEQUENCE)来标识变化的数据,列部分指定了要记录的列,其中包括了col2和col3。CREATE MATERIALIZED VIEW LOG ON test_tbl1 WITH SEQUENCE (col2, col3) INCLUDING NEW VALUES;创建名为
mv_test_tbl1的物化视图,定义物化视图为增量刷新,自动刷新物化视图的间隔为 5 分钟;在查询部分,指定了从test_tbl1表中按照col2列进行分组,并计算每个分组中的记录数(cnt)、非空col3列的记录数(cnt_col3)和col3列的总和(sum_col3)作为物化视图的结果。CREATE MATERIALIZED VIEW mv_test_tbl1 REFRESH FAST ON DEMAND START WITH current_date NEXT current_date + interval '5' minute AS SELECT col2, COUNT(*) cnt, COUNT(col3) cnt_col3, SUM(col3) sum_col3 FROM test_tbl1 GROUP BY col2;查看表
test_tbl1物化视图日志日志信息。SELECT * FROM sys.DBA_MVIEW_LOGS WHERE MASTER = 'TEST_TBL1';注意
Oracle 模式中视图
sys.DBA_MVIEW_LOGS中字段MASTER匹配表名时,表名需使用大写字母。返回结果如下:
+--------------+-----------+-----------------+-------------+--------+-------------+-----------+----------------+----------+--------------------+--------------------+----------------+-------------+----------------+-----------------+-------------------+-----------------+------------------+-------------+-----------+-----------------+ | LOG_OWNER | MASTER | LOG_TABLE | LOG_TRIGGER | ROWIDS | PRIMARY_KEY | OBJECT_ID | FILTER_COLUMNS | SEQUENCE | INCLUDE_NEW_VALUES | PURGE_ASYNCHRONOUS | PURGE_DEFERRED | PURGE_START | PURGE_INTERVAL | LAST_PURGE_DATE | LAST_PURGE_STATUS | NUM_ROWS_PURGED | COMMIT_SCN_BASED | STAGING_LOG | PURGE_DOP | LAST_PURGE_TIME | +--------------+-----------+-----------------+-------------+--------+-------------+-----------+----------------+----------+--------------------+--------------------+----------------+-------------+----------------+-----------------+-------------------+-----------------+------------------+-------------+-----------+-----------------+ | TEST_USER001 | TEST_TBL1 | MLOG$_TEST_TBL1 | NULL | NO | YES | NO | YES | YES | YES | NO | NO | NULL | NULL | 03-SEP-25 | 0 | 0 | YES | NO | 1 | 0 | +--------------+-----------+-----------------+-------------+--------+-------------+-----------+----------------+----------+--------------------+--------------------+----------------+-------------+----------------+-----------------+-------------------+-----------------+------------------+-------------+-----------+-----------------+ 1 row in set删除表
test_tbl1上的物化视图日志。DROP MATERIALIZED VIEW LOG ON test_tbl1;删除物化视图
mv_test_tbl1。DROP MATERIALIZED VIEW mv_test_tbl1;