62 読取り専用マテリアライズド・ビューの問題のトラブルシューティング

データベース・リンク、マテリアライズド・ビューの作成、およびマテリアライズド・ビューのリフレッシュに関する問題を診断および解決できます。

62.1 データベース・リンクに関する問題の診断方法

データベース・リンクが正常に機能していないと考えられる場合、Oracle Enterprise Manager Cloud Control、SQL*Plusまたは別のツールを使用してデータベース・リンクを削除し、再作成します。

  • データベース・リンク名が、ターゲット・データベースのグローバル名と同じであることを確認します。

  • スケジュールした間隔が意図したとおりであることを確認します。

  • スケジュールした間隔が、必要な実行時間よりも短くないことを確認します。

指定されたデータベースへのデータベース・リンクに接続修飾子が使用されている場合は、そのデータベースにリンクする他のデータベースにも同じ接続修飾子が必要です。たとえば、次のようにデータベース・リンクを作成するとします。

CREATE DATABASE LINK dbs1.example.com@myethernet CONNECT TO myadmin
  IDENTIFIED BY password USING 'connect_string_myethernet';

マスター・データベースかマテリアライズド・ビュー・データベースかにかかわらず、dbs1.example.com@myethernetに対応付けられたすべてのデータベースで、myethernetを接続修飾子として使用する必要があります。

62.2 マテリアライズド・ビューの作成に関する問題

マテリアライズド・ビューの作成に問題がある場合は、チェックする項目があります。

マテリアライズド・ビューの作成に失敗した場合は、次の処理を試行します。

  • マテリアライズド・ビューを作成するための必要な権限があることを確認します。マスター表とそのマテリアライズド・ビュー・ログに対するSELECT権限が必要です。詳細は、「必要な権限」を参照してください。

  • 高速リフレッシュの主キーまたは副問合せのマテリアライズド・ビューを作成しようとしている場合は、マスター表のマテリアライズド・ビュー・ログに主キーがログされることを確認します。

  • 高速リフレッシュを実行するROWIDマテリアライズド・ビューを作成する場合は、マスター表のマテリアライズド・ビュー・ログにROWIDがロギングされていることを確認します。

  • 副問合せマテリアライズド・ビューの場合は、必要な列がマテリアライズド・ビュー・ログに追加されていることを確認します。詳細は、「マテリアライズド・ビュー・ログへの列のロギング」を参照してください。

  • 高速リフレッシュを実行するマテリアライズド・ビューと関連するすべての表に対して、マテリアライズド・ビュー・ログが存在することを確認します。マテリアライズド・ビューに副問合せが含まれている場合は、副問合せで参照される表のそれぞれに対してマテリアライズド・ビュー・ログが必要です。

62.3 リフレッシュに関する問題

一般的なリフレッシュの問題を診断し、解決できます。

62.3.1 リフレッシュに関する一般的な問題

いくつかの共通の要因が、マテリアライズド・ビューのグループの自動リフレッシュを妨げる可能性があります。

これらの要因には次のものがあります。

  • マテリアライズド・ビュー・データベースでのジョブ・スレーブの欠落

  • ネットワークまたはサーバー障害の影響

  • サーバー・シャットダウンの影響

リフレッシュ・グループの問題が発生したときは、前述の状況のいずれかが、Oracleデータベースでのグループのリフレッシュの完了を妨げていないことを確認します。

62.3.2 自動リフレッシュの再試行

Oracleデータベースが自動的にリフレッシュ・グループをリフレッシュできなかった場合、リフレッシュ・グループはリフレッシュの完了が予定されたままになります。

Oracleデータベースでは、次の動作によりグループの自動リフレッシュを再試行します。

  • リフレッシュ・グループのリフレッシュの再試行を、初回は1分後、次は2分後、その次は4分後というように、失敗するたびに再試行間隔を倍にします。

  • 再試行間隔が、リフレッシュ間隔より長くなることは許可されません。

  • Oracleデータベースは、最高16回まで自動リフレッシュを再試行します。

リフレッシュ・グループのリフレッシュを16回再試行した後、エラーが引続き発生する場合は、グループは破損しているとみなされます。USER_REFRESHおよびUSER_REFRESH_CHILDRENデータ・ディクショナリ・ビューのBROKEN列を問い合せて、リフレッシュ・グループの現在の状態を確認できます。

リフレッシュ・グループが破損したとみなされる原因となったエラーは、トレース・ファイルに記録されます。リフレッシュ・グループが正常にリフレッシュされない問題を修正した後、リフレッシュ・グループを手動でリフレッシュする必要があります。これにより、自動リフレッシュが再度発生できるように、破損したフラグがリセットされます。

関連項目:

マテリアライズド・ビュー・トレース・ファイルの名前の形式はjnで、nはオペレーティング・システム固有です。各システムにおける名前は、オペレーティング・システム固有のOracleドキュメントを参照してください。

62.3.3 新規マテリアライズド・ビュー・データベースでの高速リフレッシュ・エラー

場合によっては、新規マテリアライズド・ビュー・データベースでマテリアライズド・ビューの作成中に、マスター表のマテリアライズド・ビュー・ログがパージされることがあります。

これが発生すると、次のエラーが検出される場合があります。

ORA-12004 REFRESH FAST cannot be used for materialized view materialized_view_name
ORA-12034 materialized view log on materialized_view_name younger than last refresh

関連項目:

この問題を回避する方法の詳細は、「新しいマテリアライズド・ビュー・データベースの追加」を参照してください。

62.3.4 マテリアライズド・ビューが繰り返しリフレッシュされる場合

マテリアライズド・ビュー・グループのリフレッシュが継続的に繰り返される場合、グループのリフレッシュ間隔をチェックします。

Oracleデータベースは、リフレッシュを開始する前に、リフレッシュ・グループの自動リフレッシュ間隔を評価します。リフレッシュ・グループのリフレッシュ間隔がグループ内のすべてのマテリアライズド・ビューのリフレッシュに要する時間よりも短い場合、ジョブ・スレーブが未処理ジョブのキューをチェックするたびに、リフレッシュ・グループのリフレッシュが繰り返し開始されます。

62.3.5 マテリアライズド・ビュー・ログが大きくなりすぎる場合

マスター・データベースでマテリアライズド・ビュー・ログが大きくなりすぎる場合は、ネットワークまたはデータベース障害により、マスター・データベースがマテリアライズド・ビューの削除を認識できなかったかどうかを確認してください。

マテリアライズド・ビュー・ログの部分的なパージ、または未使用のマテリアライズド・ビュー・データベースの登録解除が必要になる場合があります。

62.4 リフレッシュに関する問題の高度なトラブルシューティング

マテリアライズド・ビューのリフレッシュに問題がある場合は、いくつかの項目をチェックできます。

マテリアライズド・ビューのリフレッシュに関する問題が発生している場合、次の処理を実行します。

  • DBA_REFRESH_CHILDRENビューに表示されているNEXT_DATE値をチェックして、リフレッシュがスケジュールされているかどうかを判断します。

  • リフレッシュ間隔が経過している場合は、DBA_REFRESHビューで、マテリアライズド・ビューのリフレッシュが対応付けられたジョブ番号をチェックして、ジョブ・キューに関する問題の診断を行います。

  • 実行中のジョブ・スレーブがあるかどうかをチェックします。JOB_QUEUE_PROCESSES初期化パラメータをチェックし、DBA_JOBS_RUNNINGビューを問い合せ、オペレーティング・システムを使用してジョブ・スレーブが稼働中かどうかをチェックします。

  • 2つのマテリアライズド・ビュー間のマスター・ディテール関係を定義すると、エラーが発生することもあります。マスター・ディテール関係は、宣言参照整合性の制約を使用して、マスター表に対してのみ定義します。その後、関連するマテリアライズド・ビューを同じリフレッシュ・グループ内に入れて、この関係を保ちます。ただし、遅延(遅延可能)制約はマテリアライズド・ビューに対して定義します。

  • 同じリフレッシュ・グループ内のマテリアライズド・ビューでは、行は1つのトランザクションで更新されます。このようなトランザクションは非常に大きくなる可能性があるので、大きなロールバック・セグメント(リフレッシュ中に使用するように指定したロールバック・セグメントを含む)がマテリアライズド・ビュー・データベースで必要になるか、または、リフレッシュをより頻繁に実行してトランザクションのサイズを小さくする必要があります。

  • OracleエラーORA-12004が発生する場合は、マテリアライズド・ビュー・ログを維持しようとしたときにマスター・データベースでロールバック・セグメントが不足したか、マテリアライズド・ビュー・ログの情報が古い可能性があります。たとえば、マテリアライズド・ビュー・ログがパージまたは再作成された可能性があります。

  • 1つのマテリアライズド・ビューの完全リフレッシュでは、内部的にTRUNCATE機能が使用されるので、処理速度が向上し、ロールバック・セグメントの必要量が少なくなります。ただし、マテリアライズド・ビューが完全リフレッシュされるまで、マテリアライズド・ビューには一時的にデータが表示されないことがあります。複数のマテリアライズド・ビュー(リフレッシュ・グループなど)をリフレッシュするときは、TRUNCATE機能は使用されません。

  • マスター表を再編成するとき(たとえば、システム・リソースの再利用などの目的で)は、マスター表にTRUNCATE機能を実行して、ROWIDマテリアライズド・ビューの完全リフレッシュを実行する必要があります。そうしないと、マテリアライズド・ビューがマスター表への誤ったROWIDを持つことになります。マスター表の再編成には、DBMS_MVIEWパッケージのBEGIN_TABLE_REORGANIZATIONおよびEND_TABLE_REORGANIZATIONプロシージャを使用します。

  • リフレッシュの実行中にエラーORA-00942(表またはビューが存在しません)が発生した場合は、データベース・リンクをチェックし、マスター表とマテリアライズド・ビュー・ログに対する必要な権限があるかどうかを確認します。

  • 高速リフレッシュが成功した後で障害が発生した場合、次の点をチェックします。

    • マテリアライズド・ビュー・ログの切捨て、パージまたは削除が実行されたかどうか

    • マテリアライズド・ビュー・ログに対する必要な権限を持っているかどうか

  • 強制リフレッシュに非常に長い時間を要する場合は、リフレッシュ時に使用するマテリアライズド・ビュー・ログが削除されていないかチェックします。

  • BUILD DEFERREDを使用して作成したマテリアライズド・ビューの最初の高速リフレッシュが失敗した場合は、その他の問題をチェックする前に、前の完全リフレッシュが成功していたことを確認します。