首批通过分布式安全可靠测评,为关键业务系统打造
物化视图日志自动管理
更新时间:2026-07-15 15:27:38
OceanBase 数据库支持物化视图日志(Materialized View Log,mlog)自动管理功能,该功能包含以下两方面:
- 在创建物化视图时,分析物化视图对于基表的依赖,自动创建所需要的 mlog。
- 在后台定期裁剪 mlog,删除不被依赖的 mlog,以及精简 mlog 中的列集合,从而降低 mlog 的维护代价。
使用限制
创建物化视图时,只有显式声明为增量刷新物化视图(即指定 REFRESH FAST)或实时物化视图(即指定 ENABLE ON QUERY COMPUTATION),才会自动创建 mlog 或自动更新 mlog 定义。
注意事项
在更新 mlog 定义时,OceanBase 数据库实际会创建一个新的 mlog 表并替换原 mlog,在替换过程中,需要对相关联的增量刷新物化视图做一次增量刷新,将原 mlog 中的增量数据刷入物化视图中,这样才能安全替换 mlog。因此,当一个基表关联的物化视图个数、增量数据量较多时,更新 mlog 定义可能会是一个很耗时的操作,需要提前有所感知。
建议
mlog_trim_interval的时间间隔不要设置的太小,否则可能导致 mlog 被误裁剪,创建物化视图时又需要重新创建或更新 mlog。
相关配置
OceanBase 数据库提供了两个配置项以控制 mlog 自动化的行为:
- enable_mlog_auto_maintenance:用于控制是否启用物化视图日志自动管理功能。
- mlog_trim_interval:用于控制 mlog 后台自动裁剪任务的调度周期。
使用示例
开启 mlog 自动化管理。
说明
在 OceanBase 数据库 V4.6.0 版本中:
- 对于新创建的租户,其配置项
enable_mlog_auto_maintenance的默认值为True,即默认启用 mlog 自动管理功能。 - 对于由 OceanBase 数据库低版本(即 V4.6.0 之前的版本)升级而来的租户,其配置项
enable_mlog_auto_maintenance的默认值为False,即默认关闭 mlog 自动管理功能。
obclient> ALTER SYSTEM SET enable_mlog_auto_maintenance = True;
示例一:自动创建 mlog
创建表
test_tbl1。obclient> CREATE TABLE test_tbl1(col1 INT, col2 INT, col3 INT);直接在表
test_tbl1上创建增量刷新物化视图mv_test_tbl1。OceanBase 数据库会自动为test_tbl1表在所需的col2列上创建 mlog。obclient> CREATE MATERIALIZED VIEW mv_test_tbl1 REFRESH FAST AS SELECT col2, count(*) cnt FROM test_tbl1 GROUP BY col2;查看表
test_tbl1上物化视图日志的信息。obclient> DESC mlog$_test_tbl1;返回结果如下:
+------------+-----------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +------------+-----------------+------+------+---------+-------+ | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | | SEQUENCE$$ | BIGINT(20) | NO | PRI | NULL | NULL | | DMLTYPE$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | OLD_NEW$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | M_ROW$$ | BIGINT UNSIGNED | NO | PRI | NULL | NULL | +------------+-----------------+------+------+---------+-------+ 5 rows in set
示例二:自动更新 mlog 定义
创建表
test_tbl2。obclient> CREATE TABLE test_tbl2(col1 INT, col2 INT, col3 INT);直接在表
test_tbl2上创建增量刷新物化视图mv1_test_tbl2。OceanBase 数据库会自动为test_tbl2表在所需的col2列上创建 mlog。obclient> CREATE MATERIALIZED VIEW mv1_test_tbl2 REFRESH FAST AS SELECT col2, count(*) cnt FROM test_tbl2 GROUP BY col2;查看表
test_tbl2上物化视图日志的信息。obclient> DESC mlog$_test_tbl2;返回结果如下:
+------------+-----------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +------------+-----------------+------+------+---------+-------+ | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | | SEQUENCE$$ | BIGINT(20) | NO | PRI | NULL | NULL | | DMLTYPE$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | OLD_NEW$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | M_ROW$$ | BIGINT UNSIGNED | NO | PRI | NULL | NULL | +------------+-----------------+------+------+---------+-------+ 5 rows in set直接在表
test_tbl2上创建增量刷新物化视图mv2_test_tbl2。OceanBase 数据库检测到当前 mlog 表中只包含了col2列,因此会修改现有 mlog 定义,在 mlog 表中增加col3列。obclient> CREATE MATERIALIZED VIEW mv2_test_tbl2 REFRESH FAST AS SELECT col3, count(*) cnt FROM test_tbl2 GROUP BY col3;再次查看表
test_tbl2上物化视图日志的信息,可以观察到表test_tbl2的 mlog 表定义中包含了col2列和col3列。obclient> DESC mlog$_test_tbl2;返回结果如下:
+------------+-----------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +------------+-----------------+------+------+---------+-------+ | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | | COL3 | NUMBER(38) | YES | NULL | NULL | NULL | | SEQUENCE$$ | BIGINT(20) | NO | PRI | NULL | NULL | | DMLTYPE$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | OLD_NEW$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | M_ROW$$ | BIGINT UNSIGNED | NO | PRI | NULL | NULL | +------------+-----------------+------+------+---------+-------+ 6 rows in set
示例三:自动裁剪 mlog
创建表
test_tbl3。obclient> CREATE TABLE test_tbl3(col1 INT, col2 INT, col3 INT);直接在表
test_tbl3上创建增量刷新物化视图mv1_test_tbl3。OceanBase 数据库会自动为test_tbl3表在所需的col2列上创建 mlog。obclient> CREATE MATERIALIZED VIEW mv1_test_tbl3 REFRESH FAST AS SELECT col2, count(*) cnt FROM test_tbl3 GROUP BY col2;直接在表
test_tbl3上创建增量刷新物化视图mv2_test_tbl3。OceanBase 数据库检测到当前 mlog 表中只包含了col2列,因此会修改现有 mlog 定义,在 mlog 表中增加col3列。obclient> CREATE MATERIALIZED VIEW mv2_test_tbl3 REFRESH FAST AS SELECT col3, count(*) cnt FROM test_tbl3 GROUP BY col3;查看表
test_tbl3上物化视图日志的信息,可以观察到表test_tbl3的 mlog 表定义中包含了col2列和col3列。obclient> DESC mlog$_test_tbl3;返回结果如下:
+------------+-----------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +------------+-----------------+------+------+---------+-------+ | COL2 | NUMBER(38) | YES | NULL | NULL | NULL | | COL3 | NUMBER(38) | YES | NULL | NULL | NULL | | SEQUENCE$$ | BIGINT(20) | NO | PRI | NULL | NULL | | DMLTYPE$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | OLD_NEW$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | M_ROW$$ | BIGINT UNSIGNED | NO | PRI | NULL | NULL | +------------+-----------------+------+------+---------+-------+ 6 rows in set修改 mlog 裁剪间隔,以更快观察到裁剪结果。
obclient> ALTER SYSTEM SET mlog_trim_interval = '5s';删除物化视图
mv1_test_tbl3。obclient> DROP MATERIALIZED VIEW mv1_test_tbl3;等待 5s,查看表
test_tbl3上物化视图日志的信息,可以观察到表test_tbl3的 mlog 表定义中只剩下了col3列。obclient> DESC mlog$_test_tbl3;返回结果如下:
+------------+-----------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +------------+-----------------+------+------+---------+-------+ | COL3 | NUMBER(38) | YES | NULL | NULL | NULL | | SEQUENCE$$ | BIGINT(20) | NO | PRI | NULL | NULL | | DMLTYPE$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | OLD_NEW$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | M_ROW$$ | BIGINT UNSIGNED | NO | PRI | NULL | NULL | +------------+-----------------+------+------+---------+-------+ 5 rows in set删除物化视图
mv2_test_tbl3。obclient> DROP MATERIALIZED VIEW mv2_test_tbl3;等待 5s,查看表
test_tbl3上物化视图日志的信息,可以观察到表test_tbl3的 mlog 表已经不存在了。obclient> DESC mlog$_test_tbl3;返回结果如下:
OBE-04043: object TEST_USER001.MLOG$_TEST_TBL3 does not exist还原 mlog 裁剪间隔。
obclient> ALTER SYSTEM SET mlog_trim_interval = '1d';