最近、ORACLEマテリアライズドビューの保守に問題が発見されました。マテリアライズドビューに関連するベーステーブルのフィールド長のようなDDL変更後、マテリアライズドビューがFORCEを実行すると
または、高速リフレッシュ後、マテリアライズド・ビュー関連のuser_mview_keysおよびdba_mview_keysレコードの関連ベース表情報が失われ、マテリアライズド・ビュー関連の状況情報user_mviewsのSTALENESSが使用不能になり、dba_objectsの状況が無効になりますが、増分リフレッシュは影響を受けません。マテリアライズドビューデータ同じ
ステップ; DDLの変更が発生した場合、マテリアライズド・ビューが再コンパイルされ、マテリアライズド・ビューが完全にリフレッシュまたは再構築された場合、マテリアライズド・ビューは通常の状態になります。
以下は、マテリアライズド・ビューの保守で関連するベース表のフィールド長DDLが変更された後、再構築または完全にリフレッシュする必要があるシーンの繰り返しです。
手順1.マテリアライズドビュー関連のユーザーテストを作成し、承認します
テストデフォルトのテーブルスペースユーザーによって識別されるユーザーテストを作成します。
テストにCONNECTを許可します。
テストするリソースを付与します。
テストするマテリアライズドビューの作成を許可します。
手順2.テストユーザーの作成とアクセス許可を確認します
select * from user_sys_privs;
USERNAME PRIVILEGE ADMIN_OPTION
1テストマテリアライズドビューの作成
2無制限のテーブルスペースをテストしません
select * from USER_ROLE_PRIVS;
USERNAME GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE OS_GRANTED
1テスト接続いいえはいいいえ
2テストリソースいいえはいいいえ
ステップ3.マテリアライズドビューのベーステーブルを作成します
テーブルTEST_MV(id番号、mdate日付、名前varchar(20)主キー);を作成します。
ステップ4.マテリアライズド・ビュー・ログを作成します
TEST_MVでマテリアライズドビューログを作成する
主キー付き
新しい価値観を含む;
ステップ5.テストマテリアライズドビューを作成する
マテリアライズドビューの作成MV_TEST_MV
主キーを使用して、オンデマンドで即時のREFRESHフォースを構築します
AS select * from TEST_MV;
ステップ6.マテリアライズド・ビューによって同期された列(ベース表フィールドの長さが変更された後、マテリアライズド・ビューを直接増分リフレッシュすると、関連するマテリアライズド・ビューのデータが失われます)
select * from user_mview_keys a where a.mview_name = 'MV_TEST_MV';
1 TEST MV_TEST_MV 1 ID TEST TEST_MV TEST_MV TABLE ID
2 TEST MV_TEST_MV 2 MDATE TEST TEST_MV TEST_MV TABLE MDATE
3テストMV_TEST_MV3名前テストTEST_MVTEST_MVテーブル名
select * from dba_mview_keys a where a.mview_name = 'MV_TEST_MV';
1 TEST MV_TEST_MV 1 ID TEST TEST_MV TEST_MV TABLE ID
2 TEST MV_TEST_MV 2 MDATE TEST TEST_MV TEST_MV TABLE MDATE
3テストMV_TEST_MV3名前テストTEST_MVTEST_MVテーブル名
手順7.テストデータをソーステーブルに挿入します
TEST_MV(id、mdate、name)に挿入values(1、sysdate、 '11');
ステップ8.マテリアライズド・ビューをリフレッシュします
ベギン
dbms_mview.refresh( 'MV_TEST_MV'、 'force');
終わり;
/
ステップ9.ベース表、マテリアライズド・ビュー・データ、およびマテリアライズド・ビューのステータス情報を表示します
SQL> select * from MV_TEST_MV;
ID MDATE NAME
---------- --------- ------------------------------
120年7月23日11
SQL> select * from TEST_MV;
ID MDATE NAME
---------- --------- ------------------------------
120年7月23日11
SQL> select * from mlog $ _test_mv;
NAME SNAPTIME $ DO CHANGE_VECTOR $$ XID $$
-------------------- --------- --- ------------------- ------------------------------- ----------
86
SQL> user_mviewsからowner、mview_name、STALENESSを選択します。
OWNER MVIEW_NAME STALENESS
---------- ---------- -------------------
テストMV_TEST_MVフレッシュ
SQL> conn / as sysdba
接続されています。
SQL> select owner、object_name、object_type、status from dba_objects where object_name = 'MV_TEST_MV';
OWNER OBJECT_NAMEOBJECT_TYPEステータス
---------- ---------------------------------------- ------------------------------ ---------------------- ------
テストMV_TEST_MVマテリアライズドビューが有効
テストMV_TEST_MVテーブルが有効
ステップ9、主キー列の長さを変更します
表の変更TEST_MVmodify(name varchar(30));
表MV_TEST_MVを変更するmodify(name varchar(30));
TEST_MV(id、mdate、name)に挿入values(2、sysdate、 '22');
コミット;
ステップ10.マテリアライズド・ビューをリフレッシュします
ベギン
dbms_mview.refresh( 'MV_TEST_MV'、 'FORCE');
終わり;
/
ステップ10の後、マテリアライズド・ビューMV_TEST_MVステータスは異常であり、データベースdba_mview_keysおよびuser_mview_keysビューには関連するマテリアライズド・ビューがありません。
基本情報
-マテリアライズドビューのベーステーブル情報を表示しません
SQL> select * from dba_mview_keys a where a.mview_name = 'MV_TEST_MV';
行が選択されていません
SQL>
SQL> select * from user_mview_keys a where a.mview_name = 'MV_TEST_MV';
行が選択されていません
SQL>
-マテリアライズドビューのステータス情報が異常であることを確認してください
SQL> user_mviewsからowner、mview_name、STALENESSを選択します。
OWNER MVIEW_NAME STALENESS
---------- ---------- -------------------
TEST MV_TEST_MV UNUSABLE
SQL> conn / as sysdba
接続されています。
SQL> select owner、object_name、object_type、status from dba_objects where object_name = 'MV_TEST_MV';
OWNER OBJECT_NAMEOBJECT_TYPEステータス
---------- ---------------------------------------- ----------------------------- -------------------- -----
テストMV_TEST_MVマテリアライズドビューが無効です
テストMV_TEST_MVテーブルが有効
手順9の後でマテリアライズド・ビューの増分リフレッシュを実行しない場合は、以下のようにマテリアライズド・ビューの状態情報を確認してください。
SQL> user_mviewsからowner、mview_name、STALENESSを選択します。
OWNER MVIEW_NAME STALENESS
---------- ---------- -------------------
TEST MV_TEST_MV NEEDS_COMPILE
SQL> conn / as sysdba
接続されています。
SQL> select owner、object_name、object_type、status from dba_objects where object_name = 'MV_TEST_MV';
OWNER OBJECT_NAMEOBJECT_TYPEステータス
---------- ---------------------------------------- ------------------------ ------------------- -------
テストMV_TEST_MVマテリアライズドビューが無効です
テストMV_TEST_MVテーブルが有効
ステップ9が実行された後、マテリアライズド・ビューの状況情報に従ってマテリアライズド・ビューを再コンパイルし、増分リフレッシュを実行しますが、問題は引き続き存在します。
SQL> show user;
ユーザーは「テスト」です
SQL> ALTER MATERIALIZED VIEW TEST.MV_TEST_MV COMPILE;
マテリアライズドビューが変更されました。
SQL>
ベギン
dbms_mview.refresh( 'MV_TEST_MV'、 'FORCE');
終わり;
/
SQL> 2 3 4
PL / SQLプロシージャが正常に完了しました。
-マテリアライズドビューの状態を表示します
SQL> dba_mviewsからowner、mview_name、STALENESSを選択します。
行が選択されていません
SQL> select owner、object_name、object_type、status from dba_objects where object_name = 'MV_TEST_MV';
OWNER OBJECT_NAMEOBJECT_TYPEステータス
---------- ---------------------------------------- --------------------------- ------------------- ---- ---
テストMV_TEST_MVマテリアライズドビューが無効です
テストMV_TEST_MVテーブルが有効
手順9の後で、マテリアライズド・ビューを再コンパイルした後に完全リフレッシュを実行すると、マテリアライズド・ビューのすべてが正常になります。
SQL> show user;
ユーザーは「テスト」です
SQL> ALTER MATERIALIZED VIEW TEST.MV_TEST_MV COMPILE;
マテリアライズドビューが変更されました。
SQL>
SQL>
ベギン
dbms_mview.refresh( 'MV_TEST_MV'、 'COMPLETE');
終わり;
/ SQL> 2 3 4
SQL>
PL / SQLプロシージャが正常に完了しました。
-データベースベーステーブルは、マテリアライズドビュー情報の存在を記録します
SQL> select * from user_mview_keys a where a.mview_name = 'MV_TEST_MV';
OWNER MVIEW_NAME POSITION_IN_SELECT CONTAINER_COLUMN DETAILOBJ_OWNER DETAILOBJ_NAME DETAILOBJ_ALIAS DETAI DETAILOBJ_COLUMN
------------------------------ -------------------- ---------- ------------------ ---------------------- -------- ------------------------------ ------------ ------------------ ------------------------------- --- ------------------------------
TEST MV_TEST_MV 1 ID TEST TEST_MV TEST_MV TABLE ID
TEST MV_TEST_MV 2 MDATE TEST TEST_MV TEST_MV TABLE MDATE
TEST MV_TEST_MV 3 NAME TEST TEST_MV TEST_MV TABLE NAME
SQL> conn / as sysdba
接続されています。
SQL> l
1 * select * from dba_mview_keys a where a.mview_name = 'MV_TEST_MV'
SQL> /
OWNER MVIEW_NAME POSITION_IN_SELECT CONTAINER_COLUMN DETAILOBJ_OWNER DETAILOBJ_NAME DETAILOBJ_ALIAS DETAI DETAILOBJ_COLUMN
------------------------------ -------------------- ---------- ------------------ ---------------------- -------- ------------------------------ ------------ ------------------ ------------------------------- --- ------------------------------
TEST MV_TEST_MV 1 ID TEST TEST_MV TEST_MV TABLE ID
TEST MV_TEST_MV 2 MDATE TEST TEST_MV TEST_MV TABLE MDATE
TEST MV_TEST_MV 3 NAME TEST TEST_MV TEST_MV TABLE NAME
SQL>
-マテリアライズド・ビューの状況情報は正常です
SQL> user_mviewsからowner、mview_name、STALENESSを選択します。
行が選択されていません
SQL> connテスト/テスト
接続されています。
SQL> /
OWNER MVIEW_NAME STALENESS
---------- ---------- -------------------
テストMV_TEST_MVフレッシュ
SQL> conn / as sysdba
接続されています。
SQL> select owner、object_name、object_type、status from dba_objects where object_name = 'MV_TEST_MV';
OWNER OBJECT_NAMEOBJECT_TYPEステータス
---------- ------------------------------ ---------- ------------------------------- ------------------- -------
テストMV_TEST_MVマテリアライズドビューが有効
テストMV_TEST_MVテーブルが有効
マテリアライズド・ビューのベース表でDDLが発生した場合、マテリアライズド・ビューを再構築することで、マテリアライズド・ビューの異常状態の問題も解決できるため、ここでは説明しません。
結論:ORACLEデータベースのマテリアライズド・ビューの保守では、マテリアライズド・ビューに関連するベース・テーブルでDDL操作を実行するように注意する必要があります。DDL操作はマテリアライズド・ビューにつながります。
状態が異常です。この問題に関して、ORACLEの公式声明では、マテリアライズド・ビューのベース表でDDLが発生した後、マテリアライズド・ビューに関連する状態が異常であり、データベースのベース表のレコード情報が示されています。
情報がないことは、ORACLEの通常の動作です。この記事の実験と組み合わせると、マテリアライズドビューのベーステーブルでDDLが発生した後、マテリアライズドビュー全体を更新または再構築する必要があります。