OceanBase Database supports automatic management of materialized view logs (mlogs). This feature includes the following two aspects:
- When you create a materialized view, OceanBase Database analyzes the dependencies of the materialized view on the base table and automatically creates the required mlogs.
- OceanBase Database periodically prunes mlogs in the background, deletes mlogs that are no longer referenced, and reduces the number of columns in mlogs to reduce the maintenance cost of mlogs.
Limitations
When you create a materialized view, an mlog is automatically created or the definition of an mlog is automatically updated only if you explicitly declare the materialized view as an incremental refresh materialized view (by specifying REFRESH FAST) or a real-time materialized view (by specifying ENABLE ON QUERY COMPUTATION).
Considerations
When you update the definition of an mlog, OceanBase Database actually creates a new mlog table and replaces the original mlog. During the replacement, it performs an incremental refresh on the associated incremental refresh materialized views to transfer the incremental data from the original mlog to the materialized views. This ensures a safe replacement of the mlog. Therefore, when a base table is associated with a large number of materialized views and contains a significant amount of incremental data, updating the mlog definition may be a time-consuming operation. You need to be aware of this in advance.
We recommend that you do not set the
mlog_trim_intervalparameter to a very small value. Otherwise, the mlog may be mistakenly trimmed, and you may need to recreate or update the mlog when you create a materialized view.
Related configurations
OceanBase Database provides two parameters to control the automated behavior of mlogs:
- enable_mlog_auto_maintenance: specifies whether to enable the automatic management of mlogs.
- mlog_trim_interval: specifies the scheduling cycle of the background automatic trimming task of an mlog.
Examples
Enable mlog auto-maintenance.
Note
In OceanBase Database V4.4.2, for a new tenant, the default value of the enable_mlog_auto_maintenance parameter is True, which means that the mlog auto-maintenance feature is enabled by default. For a tenant upgraded from a previous version of OceanBase Database (V4.4.2 or earlier), the default value of the enable_mlog_auto_maintenance parameter is False, which means that the mlog auto-maintenance feature is disabled by default.
obclient> ALTER SYSTEM SET enable_mlog_auto_maintenance = True;
Example 1: Automatically create an mlog
Create a table named
test_tbl1.obclient> CREATE TABLE test_tbl1(col1 INT, col2 INT, col3 INT);Create an incremental refresh materialized view named
mv_test_tbl1on thetest_tbl1table. OceanBase Database automatically creates an mlog for thecol2column in thetest_tbl1table.obclient> CREATE MATERIALIZED VIEW mv_test_tbl1 REFRESH FAST AS SELECT col2, count(*) cnt FROM test_tbl1 GROUP BY col2;Query the information about the materialized view log of the
test_tbl1table. The query result is as follows:obclient> DESC mlog$_test_tbl1;The query result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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
Example 2: Automatically update the mlog definition
Create a table named
test_tbl2.obclient> CREATE TABLE test_tbl2(col1 INT, col2 INT, col3 INT);Create an incremental refresh materialized view named
mv1_test_tbl2on thetest_tbl2table. OceanBase Database automatically creates an mlog for thecol2column in thetest_tbl2table.obclient> CREATE MATERIALIZED VIEW mv1_test_tbl2 REFRESH FAST AS SELECT col2, count(*) cnt FROM test_tbl2 GROUP BY col2;Query the information about the materialized view log of the
test_tbl2table. The query result is as follows:obclient> DESC mlog$_test_tbl2;The query result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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 setCreate an incremental refresh materialized view named
mv2_test_tbl2on thetest_tbl2table. OceanBase Database detects that the current mlog table contains only thecol2column and updates the mlog definition to add thecol3column to the mlog table.obclient> CREATE MATERIALIZED VIEW mv2_test_tbl2 REFRESH FAST AS SELECT col3, count(*) cnt FROM test_tbl2 GROUP BY col3;Query the information about the materialized view log of the
test_tbl2table. The query result is as follows:obclient> DESC mlog$_test_tbl2;The query result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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
Example 3: Automatically prune an mlog
Create a table named
test_tbl3.obclient> CREATE TABLE test_tbl3(col1 INT, col2 INT, col3 INT);Create an incremental refresh materialized view named
mv1_test_tbl3on thetest_tbl3table. OceanBase Database automatically creates an mlog for thecol2column in thetest_tbl3table.obclient> CREATE MATERIALIZED VIEW mv1_test_tbl3 REFRESH FAST AS SELECT col2, count(*) cnt FROM test_tbl3 GROUP BY col2;Create an incremental refresh materialized view named
mv2_test_tbl3on thetest_tbl3table. OceanBase Database detects that the current mlog table contains only thecol2column and updates the mlog definition to add thecol3column to the mlog table.obclient> CREATE MATERIALIZED VIEW mv2_test_tbl3 REFRESH FAST AS SELECT col3, count(*) cnt FROM test_tbl3 GROUP BY col3;Query the information about the materialized view log of the
test_tbl3table. The query result is as follows:obclient> DESC mlog$_test_tbl3;The query result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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 setModify the mlog pruning interval to observe the pruning result faster.
obclient> ALTER SYSTEM SET mlog_trim_interval = '5s';Drop the
mv1_test_tbl3materialized view.obclient> DROP MATERIALIZED VIEW mv1_test_tbl3;Wait for 5 seconds and query the information about the materialized view log of the
test_tbl3table. The query result is as follows:obclient> DESC mlog$_test_tbl3;The query result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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 setDrop the
mv2_test_tbl3materialized view.obclient> DROP MATERIALIZED VIEW mv2_test_tbl3;Wait for 5 seconds and query the information about the materialized view log of the
test_tbl3table. The query result is as follows:obclient> DESC mlog$_test_tbl3;The query result is as follows:
OBE-04043: object TEST_USER001.MLOG$_TEST_TBL3 does not existRestore the mlog pruning interval.
obclient> ALTER SYSTEM SET mlog_trim_interval = '1d';