OceanBaseデータベースV4.3.5では、V4.3.5 BP4バージョンからマテリアライズドビューのログ(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.3.5 BP4バージョンでは:
- 新規作成されたテナントについて、構成パラメータ
enable_mlog_auto_maintenanceのデフォルト値はTrueであり、mlogの自動管理機能がデフォルトで有効になっています。 - OceanBaseデータベースの低バージョン(V4.3.5 BP4より前のバージョン)からアップグレードされたテナントについて、構成パラメータ
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データベースは、必要なcol2列に対して、テーブルtest_tbl1の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
例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 | 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
例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 | 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 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 | 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;5秒待ってから、テーブル
test_tbl3のマテリアライズドビューログ情報を確認すると、テーブルtest_tbl3のmlogテーブルは存在しなくなっています。obclient> DESC mlog$_test_tbl3;実行結果は次のとおりです:
ERROR 1146 (42S02): Table 'test_db.mlog$_test_tbl3' doesn't existmlogのクリップ間隔を元に戻します。
obclient> ALTER SYSTEM SET mlog_trim_interval = '1d';