OceanBaseデータベースは、マテリアライズドビューのログ(Materialized View Log、mlog)の自動管理機能をサポートしています。この機能には以下の2つの側面が含まれます:
- マテリアライズドビューを作成する際、そのマテリアライズドビューがベーステーブルに依存している関係を分析し、必要なmlogを自動的に作成します。
- バックグラウンドで定期的にmlogをトリミングし、依存されていないmlogを削除し、mlog内の列セットを簡略化することで、mlogのメンテナンスコストを削減します。
使用上の制限
マテリアライズドビューを作成する際、明示的に増分更新マテリアライズドビュー(REFRESH FASTを指定)またはリアルタイムマテリアライズドビュー(ENABLE ON QUERY COMPUTATIONを指定)として宣言した場合にのみ、mlogが自動的に作成されたり、mlog定義が自動的に更新されたりします。
注意点
mlog定義を更新する際、OceanBaseデータベースは実際には新しいmlogテーブルを作成して既存のmlogを置き換えます。置き換えプロセスでは、関連する増分リフレッシュマテリアライズドビューを1回増分リフレッシュし、元のmlogにある増分データをマテリアライズドビューに書き込む必要があります。これにより、mlogを安全に置き換えることができます。したがって、ベーステーブルに関連付けられたマテリアライズドビューの数や増分データ量が多い場合、mlog定義の更新は時間のかかる操作になる可能性があるため、事前に留意しておく必要があります。
mlog_trim_intervalの時間間隔は小さく設定しすぎないようにすることを推奨します。そうでないと、mlogが誤ってトリムされ、マテリアライズドビュー作成時に再度mlogを作成または更新する必要が生じる可能性があります。
関連設定
OceanBaseデータベースは、mlogの自動化動作を制御するための2つのパラメータを提供しています。
- enable_mlog_auto_maintenance:マテリアライズドビューのログ自動管理機能を有効にするかどうかを制御します。
- mlog_trim_interval:mlogバックグラウンドの自動トリミングタスクのスケジューリング間隔を制御します。
使用例
mlogの自動化管理を有効にします。
説明
OceanBaseデータベースV4.4.2バージョンでは:
- 新規作成されたテナントの場合、構成パラメータ
enable_mlog_auto_maintenanceのデフォルト値はTrueであり、mlogの自動化管理機能がデフォルトで有効になっています。 - OceanBaseデータベースの旧バージョン(V4.4.2以前)からアップグレードされたテナントの場合、構成パラメータ
enable_mlog_auto_maintenanceのデフォルト値はFalseであり、mlogの自動化管理機能がデフォルトで無効になっています。
obclient> ALTER SYSTEM SET enable_mlog_auto_maintenance = True;
例1: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
例2:mlog定義の自動更新
テーブル
test_tbl2を作成します。obclient> CREATE TABLE test_tbl2(col1 INT, col2 INT, col3 INT);テーブル
test_tbl2に直接、増分更新マテリアライズドビューmv1_test_tbl2を作成します。OceanBaseデータベースは、必要なcol2列に対して、テーブルtest_tbl2の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
例3:mlogの自動クリッピング
テーブル
test_tbl3を作成します。obclient> CREATE TABLE test_tbl3(col1 INT, col2 INT, col3 INT);テーブル
test_tbl3に直接、増分更新マテリアライズドビューmv1_test_tbl3を作成します。OceanBaseデータベースは、必要なcol2列に対して、テーブルtest_tbl3の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 setmlogクリッピング間隔を変更し、クリッピング結果をより早く確認します。
obclient> ALTER SYSTEM SET mlog_trim_interval = '5s';マテリアライズドビュー
mv1_test_tbl3を削除します。obclient> DROP MATERIALIZED VIEW mv1_test_tbl3;5秒待ってから、テーブル
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;5秒待ってから、テーブル
test_tbl3のマテリアライズドビューのログ情報を確認すると、テーブルtest_tbl3のmlogテーブルは存在しなくなっています。obclient> DESC mlog$_test_tbl3;実行結果は次のとおりです:
OBE-04043: object TEST_USER001.MLOG$_TEST_TBL3 does not existmlogクリッピング間隔を元に戻します。
obclient> ALTER SYSTEM SET mlog_trim_interval = '1d';