Oracleエラー対応(ORA-12008):ORA-12008 発生時の対処方法について

現役DBAが解説 ~Oracleエラー対応~

マテリアライズドビューのリフレッシュ操作が失敗した際にORA-12008が発生する場合があります。
本記事では、ORA-12008が発生した際の対処方法についてご紹介します。

1.エラーメッセージ

ORA-12008: マテリアライズド・ビューまたはゾーンマップのリフレッシュ・パスでエラーが発生しました
ORA-12008: error in materialized view or zonemap refresh path

データベースアラートログには以下のようなメッセージが出力されます。

<発生時刻> 
On demand
MV <スキーマ名>.<マテリアライズドビュー名> was not refreshed successfully.
Number of MV refresh failures: 1.
Encountered error ORA-12008.
kkzifr3g: Encountered error ORA-12008.

2.エラー原因・対処方法

エラー原因は様々ですが、基本的には定義したマテリアライズドビューの参照先であるオブジェクト(TABLEやVIEWなど)に原因があることが多いです。

3.エラー調査方法」からどのような原因でエラーとなっているか調査し、その原因にあった対処を行う必要があります。

3.エラー調査方法

リフレッシュエラーが発生した場合、まずは付随したエラーメッセージの有無や該当のマテリアライズドビューの状態を確認しましょう。
具体的にどのような確認を行っていくのかいくつかご紹介します。

① ORA-12008に付随したエラーメッセージの確認

手動でリフレッシュを実行した場合やアプリケーションのログが残っている場合、ORA-12008エラーと同タイミングで発生しているエラーメッセージを確認しましょう。
以下のようにマテリアライズドビューのどの箇所が原因となっているか分かる場合があります。

もしログが残っていない場合等で検証可能な場合は、該当のマテリアライズドビューを手動でリフレッシュして確認しましょう。

■マテリアライズドビューのリフレッシュエラー例

SQL> exec DBMS_MVIEW.REFRESH('V_TEST12008','c');
BEGIN DBMS_MVIEW.REFRESH('V_TEST12008','c'); END;
*
ERROR at line 1:
ORA-12008: error in materialized view or zonemap refresh path
ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 2378
ORA-00913: too many values
ORA-00904: "TEST12008"."TE": invalid identifier
ORA-06512: at "SYS.DBMS_SNAPSHOT_KKXRCA", line 85
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 15
ORA-06512: at line 1

上記例では、付随したメッセージにORA-00913およびORA-00904が発生しており、V_TEST12008の参照先であるTEST12008のTE列に問題があることが分かります。
(上記例の詳細な原因は、 「select * from <参照先オブジェクト>」でマテリアライズドビューを定義していましたが、参照先オブジェクトであるTEST12008のTE列をマテリアライズドビュー作成後に削除してしまったため不整合が発生しリフレッシュエラーとなっています)

このように参照先オブジェクトの構造に原因がある場合や、参照先オブジェクトのデータにイレギュラーなデータがある場合など原因は様々なため、リフレッシュ時のメッセージから原因を切り分けることができます。

なお、データベースアラートログにてORA-12008を検知した場合、データベースアラートログにはマテリアライズドビュー名のみしか載っていない可能性があるため、アプリケーション担当者などへ確認し本対応を行って下さい。

② マテリアライズドビューの情報を確認

DBA_MVIEWS(権限が不足している場合はALL_MVIEWSまたはUSER_MVIEWS)を利用して、マテリアライズドビューのリフレッシュ日時やリフレッシュ方法など様々な情報を確認することができます。
定期的にマテリアライズドビューのリフレッシュが行われている中ORA-12008が発生した場合には、最後にリフレッシュが成功した日時からエラーが発生した日時までに何か通常と異なる事象があったかなどを確認することも有効的です。

なお、エラー発生日時よりも後にリフレッシュ日時が更新されている場合は、すでにリフレッシュエラーが解消されている可能性があります。
※DBA_MVIEW_ANALYSISでも類似した情報の確認が可能です

■DBA_MVIEWSの表示例

SQL> select OWNER, MVIEW_NAME, QUERY, REFRESH_METHOD, LAST_REFRESH_DATE
  2    from DBA_MVIEWS
  3   where MVIEW_NAME = 'V_TEST12008';

OWNER    MVIEW_NAME      QUERY                       REFRESH_ LAST_REFRESH_DATE
-------- --------------- --------------------------- -------- -------------------
TEST     V_TEST12008     select * from TEST12008     FORCE    2023/07/01 00:00:00

OWNER:マテリアライズドビューオブジェクトの所有スキーマ
MVIEW_NAME:マテリアライズドビューのオブジェクト名
QUERY:マテリアライズドビューを定義した問合せ文
REFRESH_METHOD:マテリアライズドビューのリフレッシュ方法
LAST_REFRESH_DATE:マテリアライズドビューがリフレッシュされた最新日時

※その他にもマテリアライズドビューに関する情報が確認できる列があります。
詳細はオラクル社のマニュアル「データベース・リファレンス」をご確認ください。

③ マテリアライズドビューの定義を確認

エラーとなったマテリアライズドビューとその参照先オブジェクトの定義に不整合がないか確認しましょう。
マテリアライズドビューに定義されたselect文を実行してエラーが出ないかを確認することも有効的です。

ただし、データ件数が多い可能性もあるためまずはcount関数を利用して確認することをお勧めします。

4.最後に

ORA-12008 が発生した際、まずはマテリアライズドビューおよび参照先のオブジェクト情報を確認しましょう。
可能な場合は手動でリフレッシュ操作を行い、詳細なエラー原因を確認することをお勧めします。