マテリアライズドビューのログ(Materialized View Log、mlog)は、ベーステーブルの増分更新データを記録し、マテリアライズドビューの高速リフレッシュ機能をサポートするために使用されます。mlogは変更履歴を追跡するテーブルであり、ベーステーブルの変更を追跡し、それらの変更を対応するマテリアライズドビューに適用することで、高速なリフレッシュを実現します。
マテリアライズドビューのログの自動管理機能が有効になっている場合、OceanBaseデータベースは増分更新マテリアライズドビューまたはリアルタイムマテリアライズドビューを作成する際に、自動的にmlogを作成またはmlog定義を自動的に更新します。
説明
V4.3.5バージョンでは、V4.3.5 BP4バージョンからマテリアライズドビューのログの自動管理機能がサポートされています。詳細については、マテリアライズドビューのログの自動管理を参照してください。
制限事項
マテリアライズドビューのログは、通常のテーブルとマテリアライズドビューにのみ作成できます。
1つのベーステーブルは、1つのマテリアライズドビューのログとのみバインドされます。
マテリアライズドビューのログを作成する際、ベーステーブルでトランザクションが実行中の場合、そのトランザクションが終了するまで作成操作はブロックされます。
マテリアライズドビューのログはLOB型の列をサポートしますが、LOBデータのインラインストレージのみサポートしています。LOB型に関する詳細は、LOB型を参照してください。
注意
OceanBaseデータベースV4.3.5では、マテリアライズドビューのログはV4.3.5 BP1以降のバージョンからLOB型の列をサポートしています。
マテリアライズドビューのログは、現在、JSON、XML、GIS、UDTの4種類のデータをサポートしていません。
マテリアライズドビューのログは、現在、生成列(仮想列および非仮想列を含む)をサポートしていません。
マテリアライズドビューのログは、現在、指定パーティションをサポートしておらず、そのパーティションとベーステーブルのパーティションはバインド関係になります。
マテリアライズドビューのログの名前の長さ制限は通常のテーブルと同じで、64文字を超えることはできません。マテリアライズドビューのログの名前には
mlog$_というプレフィックスが付加されるため、マテリアライズドビューのログを作成するベーステーブルの名前は58文字を超えてはなりません。マテリアライズドビューのログは、テーブルレベルの復旧をサポートしていません。
マテリアライズドビューのログは、個別に削除した場合、ゴミ箱に移動しません。
マテリアライズドビューのログは、作成後に
ALTER操作をサポートしていません。マテリアライズドビューのログには、インデックスを作成することができません。
マテリアライズドビューのログではDML操作をサポートしておらず、エラーが報告されます。
使用権限
- マテリアライズドビューのログを作成するには、ベーステーブルに対する
SELECT権限とCREATE TABLE権限が必要です。 - マテリアライズドビューのログを変更するには、ベーステーブルに対する
ALTER権限が必要です。 - マテリアライズドビューのログを削除するには
DROP TABLE権限が必要です。 - マテリアライズドビューのログには
SELECT権限のみ付与でき、他のDML操作はサポートされていません。
マテリアライズドビューのログスキーマ定義
1つのテーブルにはマテリアライズドビューのログが1つしか存在できず、そのスキーマ名は mlog$_table となります。ここで、table はベーステーブルの名前を指します。
マテリアライズドビューのログのスキーマ定義は以下のとおりです:
| 列名 | タイプ | 説明 |
|---|---|---|
| sequence$$ | in64_t | 自動インクリメント列であり、マテリアライズドビューのログ(mlog)の主キー列です。
説明mlogの主キーは、ベーステーブルの主キー、すべてのパーティションキー(存在する場合)、および自動インクリメント列 |
| primary key | ベーステーブルに従う | ベーステーブルが主キーを持つ場合、mlogにはベーステーブルの主キー列が記録されます(複合主キーの場合は複数の列が含まれます)。 |
| dmltype$$ | char(1) | DMLタイプを記録します。I、D、U の3つの値があり、それぞれ INSERT、DELETE、UPDATE を表します。 |
| old_new$$ | char(1) | UPDATE ステートメントで古い値と新しい値をマークするために使用されます。UPDATE 1行はマテリアライズドビューのログに2行のデータを書き込みます。1行は UPDATE 前の古い値、もう1行は UPDATE 後の新しい値で、それぞれ O と N でマークされます。 |
| column 1 | ベーステーブルに従う | ベーステーブルの通常の列1。 |
| ... | N/A | N/A |
| column N | ベーステーブルに従う | ベーステーブルの通常の列N。 |
| ora_rowscn | N/A | 仮想列であり、ストレージ層の隠れた列に記録され、読み取ることができます。 |
| m_row$$ | uint64_t | ベーステーブルが主キーを持たない場合にのみ、mlogにこの値が記録されます。mlogには必ずベーステーブルの主キー列を含める必要があります。ベーステーブルが主キーを持たない場合、ベーステーブルの隠れた主キーの名前はmlog内で M_ROW$$ となります。 |
既存のマテリアライズドビューのログを操作する
- マテリアライズドビューのログが存在するスキーマの構造とそのデータを直接照会できます。
- DBMS_MVIEW.PURGE_LOG(table_name) を使用して、特定のベーステーブルのマテリアライズドビューのログに対して
PURGE操作を実行できます。 - マテリアライズドビューのログのサイズが利用可能なディスク容量を超えると、エラーが報告されます。この場合、そのマテリアライズドビューのログを削除して再作成する必要があります。
ベーステーブル操作がマテリアライズドビューのログに与える影響
ベーステーブルのDML操作
マテリアライズドビューのログテーブルとは、ベーステーブルに対するDML操作を記録するために定義されたものです。そのため、ベーステーブルに対してINSERT、DELETE、UPDATE操作を行うと、最終的にはすべてマテリアライズドビューのログに記録されます。具体的には以下の通りです:
- ベーステーブルに対して
INSERT操作を行うと、挿入される各行データごとに、マテリアライズドビューのログにも1件のレコードが生成されて挿入されます。このレコードのdmltype$$列値はI、old_new$$列値はNとなります。 - ベーステーブルに対して
DELETE操作を行うと、削除される各行データごとに、マテリアライズドビューのログにも1件のレコードが生成されて挿入されます。このレコードのdmltype$$列値はD、old_new$$列値はOとなります。 - ベーステーブルに対して
UPDATE操作を行うと、変更される各行データごとに、マテリアライズドビューのログに2件のレコードが生成されて挿入されます。1件目のレコードにはUPDATEされる行の元の値が記録され、dmltype$$列値はU、old_new$$列値はOとなります。2件目のレコードにはUPDATE後の新しい値が記録され、dmltype$$列値はU、old_new$$列値はNとなります。
ベーステーブルのDDL操作
ベーステーブルを削除する前に、対応するマテリアライズドビューのログを先に削除する必要があります。そうしないとエラーが発生します。マテリアライズドビューのログはベーステーブルと一対一で結びついているため、ベーステーブルを直接削除してマテリアライズドビューのログだけを保持することはサポートされていません。
ベーステーブルでサポートされているDDL操作の詳細については、オンラインDDLとオフラインDDL操作を参照してください。
マテリアライズドビューのログを作成する
説明
OceanBaseデータベースのmlogは、現在パーティション(Partition)の指定に対応していません。mlogのパーティションとベーステーブルのパーティションは、1対1で結びついています。
権限要件
マテリアライズドビューのログを作成するには、CREATE TABLE とベーステーブルの SELECT 権限が必要です。OceanBaseデータベースの権限の詳細については、MySQLモードの権限分類を参照してください。
構文
マテリアライズドビューのログを作成するSQLステートメントの形式は以下のとおりです:
CREATE [OR REPLACE] MATERIALIZED VIEW LOG ON [database.] table_name
[parallel_clause]
[with_clause]
[mv_log_purge_clause];
パラメータの説明:
OR REPLACE:オプション。OR REPLACEを指定すると、対応するmlogが既に存在する場合、定義に従って新しいmlogを作成し、既存のmlogを新しいmlogに置き換えます。mlogの再作成プロセスは、マテリアライズドビューとベーステーブルの通常の読み書きに影響を与えません。説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP3バージョンから
OR REPLACEパラメータがサポートされています。table_name:マテリアライズドビューのログに対応するベーステーブル名を指定します。parallel_clause:オプション。マテリアライズドビューのログのクリーンアップの並列度を指定するために使用されます。with_clause:オプション。マテリアライズドビューのログに含まれる補助列を指定します。mv_log_purge_clause:オプション。マテリアライズドビューのログ内のデータの削除時間を指定します。
マテリアライズドビューのログを作成する構文の詳細なパラメータの説明については、CREATE MATERIALIZED VIEW LOGを参照してください。
例:
テーブル
tbl1を作成します。CREATE TABLE tbl1 (col1 INT, col2 VARCHAR(20), col3 INT, PRIMARY KEY(col1, col3)) PARTITION BY HASH(col3) PARTITIONS 10;tbl1テーブルにマテリアライズドビューのログを作成します。マテリアライズドビューのログの並列処理の並列度を5に指定し、マテリアライズドビューのログがcol2列の変更情報を記録し、変更前後の新しい値も記録するようにします。また、マテリアライズドビューのログが現在の日付から始まり、1日ごとに期限切れのマテリアライズドビューのログレコードをクリーンアップするように設定します。CREATE MATERIALIZED VIEW LOG ON tbl1 PARALLEL 5 WITH SEQUENCE(col2) INCLUDING NEW VALUES PURGE START WITH sysdate() NEXT sysdate() + interval 1 day;テーブル
tbl1上のマテリアライズドビューのログの情報を確認します。DESC mlog$_tbl1;実行結果は次のとおりです:
+------------+-------------+------+------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+------+---------+-------+ | col1 | int(11) | NO | PRI | NULL | | | col2 | varchar(20) | YES | | NULL | | | col3 | int(11) | NO | PRI | NULL | | | SEQUENCE$$ | bigint(20) | NO | PRI | NULL | | | DMLTYPE$$ | varchar(1) | YES | | NULL | | | OLD_NEW$$ | varchar(1) | YES | | NULL | | +------------+-------------+------+------+---------+-------+ 6 rows in set
マテリアライズドビューのログを変更する
説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP1バージョンからマテリアライズドビューのログを変更できるようになりました。
権限要件
ALTER MATERIALIZED VIEW LOG ステートメントを実行するには、現在のユーザーが対象となるベーステーブルに対する ALTER 権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、MySQLモードの権限分類を参照してください。
構文
マテリアライズドビューのログを変更するSQLステートメントの書式は以下のとおりです:
ALTER MATERIALIZED VIEW LOG ON [database.]table_name alter_mlog_action_list;
alter_mview_action_list:
alter_mlog_action [, alter_mlog_action ...]
alter_mlog_action:
parallel_clause
| PURGE [[START WITH expr] [NEXT expr]]
| LOB_INROW_THRESHOLD [=] integer
parallel_clause:
NOPARALLEL
| PARALLEL integer
パラメータの説明:
database.:オプション。マテリアライズドビューが存在するデータベースを指定します。database.を省略した場合、デフォルトでベーステーブルは現在のセッションが接続しているデータベースに存在します。table_name:マテリアライズドビューのログに対応するベーステーブル名を指定します。alter_mlog_action_list:マテリアライズドビューのログに対して実行できる変更操作のリストを示します。複数の操作を同時に指定でき、英語のカンマ(,)で区切ります。
マテリアライズドビューのログを変更する構文の詳細なパラメータの説明については、ALTER MATERIALIZED VIEW LOGを参照してください。
例:
テーブル
test_tbl1を作成します。CREATE TABLE test_tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT, col4 TEXT);test_tbl1テーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON test_tbl1 WITH SEQUENCE(col2, col3, col4) INCLUDING NEW VALUES;テーブル
test_tbl1のマテリアライズドビューのログの並列度を5に変更します。ALTER MATERIALIZED VIEW LOG ON test_tbl1 PARALLEL 5;テーブル
test_tbl1のマテリアライズドビューのログを変更し、現在の日付から毎1日ごとに期限切れのマテリアライズドビューのログレコードをクリーンアップします。ALTER MATERIALIZED VIEW LOG ON test_tbl1 PURGE START WITH sysdate() NEXT sysdate() + INTERVAL 1 DAY;テーブル
test_tbl1のマテリアライズドビューのログLOBインラインストレージ長のしきい値を変更します。ALTER MATERIALIZED VIEW LOG ON test_tbl1 LOB_INROW_THRESHOLD 10000;
マテリアライズドビューのログを削除する
注意事項
- マテリアライズドビューのログを削除する際、ベーステーブルが実行中のトランザクション内にある場合、そのトランザクションが終了するまで削除操作はブロックされます。
- マテリアライズドビューのログを個別に削除しても、マテリアライズドビューはゴミ箱に移動しません。
権限要件
マテリアライズドビューのログを削除するには、DROP TABLE 権限が必要です。OceanBaseデータベースの権限の詳細については、MySQLモードの権限分類を参照してください。
構文
マテリアライズドビューのログを削除するSQLステートメントの形式は次のとおりです:
DROP MATERIALIZED VIEW LOG ON [database.] table;
パラメータの説明:
database.:オプション。マテリアライズドビューのログのベーステーブルが存在するデータベースを指定します。database.を省略した場合、デフォルトでベーステーブルはユーザー自身のデータベースに存在します。table:マテリアライズドビューのログに対応するベーステーブル名を指定します。
例:
テーブル tbl1 のマテリアライズドビューのログを削除します。
DROP MATERIALIZED VIEW LOG ON tbl1;
例
この例では、通常のテーブル、マテリアライズドビューのログ、増分更新されるマテリアライズドビューを作成する方法を示し、マテリアライズドビューのログを削除する方法と、増分更新されるマテリアライズドビューの操作情報について説明します。
テーブル
test_tbl1を作成します。CREATE TABLE test_tbl1 (col1 INT PRIMARY KEY, col2 INT, col3 INT);test_tbl1テーブルにマテリアライズドビューのログを作成し、変更されたデータを識別するためにシーケンス番号(SEQUENCE)を使用するように指定します。列部分では、記録する列を指定しており、col2とcol3が含まれます。CREATE MATERIALIZED VIEW LOG ON test_tbl1 WITH SEQUENCE (col2, col3) INCLUDING NEW VALUES;mv_test_tbl1という名前のマテリアライズドビューを作成し、マテリアライズドビューを増分更新として定義します。マテリアライズドビューを自動更新する間隔は5分です。クエリ部分では、test_tbl1テーブルからcol2列でグループ化し、各グループ内のレコード数(cnt)、NULL以外のcol3列のレコード数(cnt_col3)、col3列の合計(sum_col3)をマテリアライズドビューの結果として計算するように指定します。CREATE MATERIALIZED VIEW mv_test_tbl1 REFRESH FAST ON DEMAND START WITH sysdate() NEXT sysdate() + interval 5 minute AS SELECT col2, COUNT(*) cnt, COUNT(col3) cnt_col3, SUM(col3) sum_col3 FROM test_tbl1 GROUP BY col2;テーブル
test_tbl1のマテリアライズドビューのログ情報を確認します。SELECT * FROM oceanbase.DBA_MVIEW_LOGS WHERE MASTER = 'test_tbl1';実行結果は次のとおりです:
+-----------+-----------+-----------------+-------------+--------+-------------+-----------+----------------+----------+--------------------+--------------------+----------------+-------------+----------------+---------------------+-------------------+-----------------+------------------+-------------+-----------+-----------------+ | LOG_OWNER | MASTER | LOG_TABLE | LOG_TRIGGER | ROWIDS | PRIMARY_KEY | OBJECT_ID | FILTER_COLUMNS | SEQUENCE | INCLUDE_NEW_VALUES | PURGE_ASYNCHRONOUS | PURGE_DEFERRED | PURGE_START | PURGE_INTERVAL | LAST_PURGE_DATE | LAST_PURGE_STATUS | NUM_ROWS_PURGED | COMMIT_SCN_BASED | STAGING_LOG | PURGE_DOP | LAST_PURGE_TIME | +-----------+-----------+-----------------+-------------+--------+-------------+-----------+----------------+----------+--------------------+--------------------+----------------+-------------+----------------+---------------------+-------------------+-----------------+------------------+-------------+-----------+-----------------+ | test_db | test_tbl1 | mlog$_test_tbl1 | NULL | NO | YES | NO | YES | YES | YES | NO | NO | NULL | NULL | 2025-09-03 14:13:06 | 0 | 0 | YES | NO | 1 | 0 | +-----------+-----------+-----------------+-------------+--------+-------------+-----------+----------------+----------+--------------------+--------------------+----------------+-------------+----------------+---------------------+-------------------+-----------------+------------------+-------------+-----------+-----------------+ 1 row in setテーブル
test_tbl1上のマテリアライズドビューのログを削除します。DROP MATERIALIZED VIEW LOG ON test_tbl1;マテリアライズドビュー
mv_test_tbl1を削除します。DROP MATERIALIZED VIEW mv_test_tbl1;