首批通过分布式安全可靠测评,为关键业务系统打造
物化视图日志自动管理
更新时间:2026-07-15 15:16:39
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 | int(11) | YES | | NULL | | | SEQUENCE$$ | bigint(20) | NO | PRI | NULL | | | DMLTYPE$$ | varchar(1) | YES | | NULL | | | OLD_NEW$$ | varchar(1) | YES | | NULL | | | M_ROW$$ | bigint unsigned | NO | PRI | 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 | int(11) | YES | | NULL | | | SEQUENCE$$ | bigint(20) | NO | PRI | NULL | | | DMLTYPE$$ | varchar(1) | YES | | NULL | | | OLD_NEW$$ | varchar(1) | YES | | NULL | | | M_ROW$$ | bigint unsigned | NO | PRI | 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 | int(11) | YES | | NULL | | | col3 | int(11) | YES | | NULL | | | SEQUENCE$$ | bigint(20) | NO | PRI | NULL | | | DMLTYPE$$ | varchar(1) | YES | | NULL | | | OLD_NEW$$ | varchar(1) | YES | | NULL | | | M_ROW$$ | bigint unsigned | NO | PRI | 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 | int(11) | YES | | NULL | | | col3 | int(11) | YES | | NULL | | | SEQUENCE$$ | bigint(20) | NO | PRI | NULL | | | DMLTYPE$$ | varchar(1) | YES | | NULL | | | OLD_NEW$$ | varchar(1) | YES | | NULL | | | M_ROW$$ | bigint unsigned | NO | PRI | 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 | int(11) | YES | | NULL | | | SEQUENCE$$ | bigint(20) | NO | PRI | NULL | | | DMLTYPE$$ | varchar(1) | YES | | NULL | | | OLD_NEW$$ | varchar(1) | YES | | NULL | | | M_ROW$$ | bigint unsigned | NO | PRI | 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;返回结果如下:
ERROR 1146 (42S02): Table 'test_db.mlog$_test_tbl3' doesn't exist还原 mlog 裁剪间隔。
obclient> ALTER SYSTEM SET mlog_trim_interval = '1d';