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 | 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データベースは、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
例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';