ORACLEマテリアライズド・ビューの保守では、フィールド長クラスDDLの変更後に、関連するベース表を再構築するか、完全にリフレッシュする必要があります。

    最近、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'、 'C​​OMPLETE');

終わり;

/ 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が発生した後、マテリアライズドビュー全体を更新または再構築する必要があります。


 

 

おすすめ

転載: blog.csdn.net/www_xue_xi/article/details/109406059