OceanBase Database supports automatic management of materialized view logs (mlogs). This feature covers two main aspects:
- When you create a materialized view, OceanBase Database analyzes its dependencies on the base table and automatically creates the required mlogs.
- OceanBase Database periodically trims mlogs in the background. Specifically, it removes mlogs that are no longer referenced and reduces the number of columns in mlogs to lower the maintenance cost.
Limitations
Mlogs are automatically created or updated only when the materialized view is explicitly defined as an incremental refresh view (by specifying REFRESH FAST) or as 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, the incremental data in the original mlog is refreshed to the incremental refresh materialized views associated with the original mlog. Therefore, when a base table is associated with a large number of materialized views and contains a large amount of incremental data, updating the mlog definition may be a time-consuming operation.
- We recommend that you set the
mlog_trim_intervalparameter to a relatively large value. Otherwise, the mlog may be incorrectly trimmed, and you may need to recreate or update the mlog when you create a materialized view.
Related parameters
OceanBase Database provides two parameters to control the automatic management 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 mlogs.
Examples
Enable the mlog auto-maintenance feature.
Note
In OceanBase Database V4.4.2:
- For newly created tenants, the default value of the
enable_mlog_auto_maintenanceparameter isTrue, which means the mlog auto-maintenance feature is enabled by default. - For tenants upgraded from an earlier version of OceanBase Database (V4.4.2 or earlier), the default value of the
enable_mlog_auto_maintenanceparameter isFalse, which means 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 on thecol2column of 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 logs of the
test_tbl1table.obclient> DESC mlog$_test_tbl1;The returned result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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
Example 2: Automatically update the definition of an mlog
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 on thecol2column of 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 logs of the
test_tbl2table.obclient> DESC mlog$_test_tbl2;The returned result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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 setCreate an incremental refresh materialized view named
mv2_test_tbl2on thetest_tbl2table. OceanBase Database detects that the current mlog table contains only thecol2column and modifies the existing 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 logs of the
test_tbl2table again. You can find that the mlog table definition of thetest_tbl2table contains thecol2andcol3columns.obclient> DESC mlog$_test_tbl2;The returned result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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
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 on thecol2column of 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 modifies the existing 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 logs of the
test_tbl3table again. You can find that the mlog table definition of thetest_tbl3table contains thecol2andcol3columns.obclient> DESC mlog$_test_tbl3;The returned result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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 setChange the mlog pruning interval to observe the pruning result more quickly.
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 logs of the
test_tbl3table again. You can find that the mlog table definition of thetest_tbl3table contains only thecol3column.obclient> DESC mlog$_test_tbl3;The returned result is as follows:
+------------+-----------------+------+------+---------+-------+ | 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 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 logs of the
test_tbl3table again. You can find that the mlog table of thetest_tbl3table no longer exists.obclient> DESC mlog$_test_tbl3;The returned result is as follows:
ERROR 1146 (42S02): Table 'test_db.mlog$_test_tbl3' doesn't existRestore the mlog pruning interval.
obclient> ALTER SYSTEM SET mlog_trim_interval = '1d';