マテリアライズドビューのログ(Materialized View Log、mlog)は、ベーステーブルの増分更新データを記録し、マテリアライズドビューの高速更新機能をサポートします。mlogは変更を追跡するレコードテーブルであり、ベーステーブルの変更を対応するマテリアライズドビューに適用することで、高速な更新を実現します。
マテリアライズドビューのログの自動管理機能を有効にすると、OceanBaseデータベースは、増分更新マテリアライズドビューまたはリアルタイムマテリアライズドビューを作成する際に、自動的にmlogを作成またはmlog定義を更新します。マテリアライズドビューのログの自動管理機能の詳細については、マテリアライズドビューのログの自動管理を参照してください。
使用制限
- マテリアライズドビューのログは、通常テーブルとマテリアライズドビューにのみ作成できます。
- 1つのベーステーブルは1つのマテリアライズドビューのログとのみ紐づけられます。
- マテリアライズドビューのログを作成する際、ベーステーブルでトランザクションが実行中の場合、そのトランザクションが終了するまで作成操作はブロックされます。
- マテリアライズドビューのログはLOB型の列をサポートしますが、LOBデータのインラインストレージのみをサポートします。LOB型に関する詳細は、LOB型を参照してください。
- マテリアライズドビューのログは、現在以下の4種類のデータ型をサポートしていません:JSON、XML、空間データ、UDT。
- マテリアライズドビューのログは、生成列(仮想列および非仮想列を含む)をサポートしていません。
- マテリアライズドビューのログは、指定したパーティションをサポートしていません。そのパーティションとベーステーブルのパーティションは紐づけられています。
- マテリアライズドビューのログの名前の最大長は通常テーブルと同じで、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件のレコードが生成されます。最初のレコードにはUPDATE前の値が記録され、dmltype$$列の値はU、old_new$$列の値はOとなります。2番目のレコードにはUPDATE後の新しい値が記録され、dmltype$$列の値はU、old_new$$列の値はNとなります。
ベーステーブルのDDL操作
ベーステーブルを削除する前に、対応するマテリアライズドビューのログを削除する必要があります。そうでない場合、エラーが発生します。これは、マテリアライズドビューのログとベーステーブルが一対一で結びついているためであり、ベーステーブルのみを削除してマテリアライズドビューのログのみを保持することはサポートされていません。
ベーステーブルでサポートされているDDL操作の詳細については、オンラインDDLとオフラインDDL操作を参照してください。
マテリアライズドビューのログを作成する
説明
OceanBaseデータベースのmlogは、現在パーティション(Partition)の指定に対応していません。mlogのパーティションとベーステーブルのパーティションは、バインドされた関係にあります。
権限要件
マテリアライズドビューのログを作成するには、CREATE TABLE 権限とベーステーブルに対する SELECT 権限が必要です。OceanBaseデータベースの権限の詳細については、Oracleモードの権限分類を参照してください。
構文
マテリアライズドビューのログを作成するSQLステートメントの形式は次のとおりです:
CREATE [OR REPLACE] MATERIALIZED VIEW LOG ON [schema.] table_name
[parallel_clause]
[with_clause]
[mv_log_purge_clause];
パラメータ説明:
OR REPLACE:オプションです。OR REPLACEを指定すると、対応するmlogが既に存在する場合、定義に従って新しいmlogを作成し、既存のmlogを新しいmlogに置き換えます。mlogの再作成処理は、マテリアライズドビューおよびベーステーブルへの通常の読み書きに影響しません。table_name:マテリアライズドビューのログに対応するベーステーブル名を指定します。parallel_clause:オプションです。マテリアライズドビューのログクリーンアップの並列度を指定するために使用します。with_clause:オプションです。マテリアライズドビューのログに含まれる補助列を指定します。mv_log_purge_clause:オプションです。マテリアライズドビューのログ内データの削除時刻を指定します。
マテリアライズドビューのログ作成構文の詳細なパラメータ説明については、CREATE MATERIALIZED VIEW LOGを参照してください。
例:
テーブル
tbl1を作成します。CREATE TABLE tbl1 (col1 NUMBER, col2 VARCHAR2(20), col3 NUMBER, 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 current_date NEXT current_date + 1;テーブル
tbl1上のマテリアライズドビューのログ情報を確認します。DESC mlog$_tbl1;実行結果は次のとおりです:
+------------+--------------+------+------+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +------------+--------------+------+------+---------+-------+ | COL1 | NUMBER | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(20) | YES | NULL | NULL | NULL | | COL3 | NUMBER | NO | PRI | NULL | NULL | | SEQUENCE$$ | BIGINT(20) | NO | PRI | NULL | NULL | | DMLTYPE$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | | OLD_NEW$$ | VARCHAR2(1 ) | YES | NULL | NULL | NULL | +------------+--------------+------+------+---------+-------+ 6 rows in set
マテリアライズドビューのログを変更する
権限要件
ALTER MATERIALIZED VIEW LOG ステートメントを実行するには、現在のユーザーがベーステーブルに対する ALTER 権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、Oracleモードの権限分類を参照してください。
構文
マテリアライズドビューのログを変更するSQLステートメントの形式は次のとおりです:
ALTER MATERIALIZED VIEW LOG ON [schema.]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]]
parallel_clause:
NOPARALLEL
| PARALLEL integer
パラメータ説明:
schema.:オプションです。マテリアライズドビューのログのベーステーブルが存在するスキーマを指定します。schema.を省略した場合、デフォルトでベーステーブルは現在のセッションが存在するスキーマにあります。table_name:マテリアライズドビューのログに対応するベーステーブル名を指定します。alter_mlog_action_list:マテリアライズドビューのログに対して実行できる変更操作のリストを示します。複数の操作を同時に指定することができ、英字のカンマ(,)で区切ります。
マテリアライズドビューのログを変更する構文の詳細なパラメータ説明については、ALTER MATERIALIZED VIEW LOGを参照してください。
例:
テーブル
test_tbl1を作成します。CREATE TABLE test_tbl1 (col1 NUMBER PRIMARY KEY, col2 VARCHAR2(20), col3 NUMBER, col4 BLOB);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 current_date NEXT current_date + 1;
マテリアライズドビューのログを削除する
注意事項
- マテリアライズドビューのログを削除する際、ベーステーブルが実行中のトランザクション内にある場合、そのトランザクションが終了するまで削除操作はブロックされます。
- マテリアライズドビューのログを個別に削除しても、マテリアライズドビューはごみ箱に移動しません。
権限要件
マテリアライズドビューのログを削除するには DROP TABLE 権限が必要です。OceanBaseデータベースの権限の詳細については、Oracleモードの権限分類を参照してください。
構文
マテリアライズドビューのログを削除するSQLステートメントの形式は次のとおりです:
DROP MATERIALIZED VIEW LOG ON [schema.] table;
パラメータ説明:
schema.:オプションです。マテリアライズドビューのログのベーステーブルが存在するスキーマを指定します。schema.を省略した場合、デフォルトでベーステーブルは作成者自身のスキーマにあります。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 current_date NEXT current_date + 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 sys.DBA_MVIEW_LOGS WHERE MASTER = 'TEST_TBL1';注意
Oracleモードでは、ビュー
sys.DBA_MVIEW_LOGSのフィールドMASTERがテーブル名と一致する場合、テーブル名は大文字である必要があります。実行結果は次のとおりです:
+--------------+-----------+-----------------+-------------+--------+-------------+-----------+----------------+----------+--------------------+--------------------+----------------+-------------+----------------+-----------------+-------------------+-----------------+------------------+-------------+-----------+-----------------+ | 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_USER001 | TEST_TBL1 | MLOG$_TEST_TBL1 | NULL | NO | YES | NO | YES | YES | YES | NO | NO | NULL | NULL | 03-SEP-25 | 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;