ヘッダーをスキップ

Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド
11g リリース1(11.1)

E05700-03
目次
目次
索引
索引

戻る 次へ

18 ブロック・メディア・リカバリの実行

この章では、データファイル内の個々のデータ・ブロックをリストアおよびリカバリする方法について説明します。この章の内容は、次のとおりです。

ブロック・メディア・リカバリの概要

この項では、ブロック・メディア・リカバリの目的および基本的な概念について説明します。

ブロック・メディア・リカバリの目的

ブロック・メディア・リカバリを使用すると、データファイル内の1つ以上の破損したデータ・ブロックをリカバリできます。ブロック・メディア・リカバリには、データファイルのメディア・リカバリにはない次のようなメリットがあります。

ブロック・メディア・リカバリは、ブロックが少数でその数がわかっている場合に発生する物理的な破損の問題に特に有効です。ブロックレベルのデータ消失は、通常、広範囲なデータ消失は引き起こさない断続的でランダムなI/Oエラーや、破損したメモリーがディスクに書き込まれることが原因で発生します。ブロック・メディア・リカバリは、データの消失または破損の程度が不明で、データファイル全体のリカバリが必要な場合には適していません。このような場合は、データファイルのメディア・リカバリが最適です。

ブロック・メディア・リカバリの基本的な概念

ほとんどの場合、データベースは、破損が最初に発生したときに、ブロックをメディア破損とマークし、ディスクに書き込みます。それ以降のブロックの読取りは、ブロックがリカバリされるまで正常に実行できません。ブロック・リカバリは、破損とマークされたブロックまたは破損チェックが失敗したブロックに対してのみ実行できます。

ブロック・メディア・リカバリは、RECOVER ...BLOCKコマンドを使用して実行します。デフォルトでは、Recovery Managerは、ブロックの完全な状態に近いコピーのフラッシュバック・ログを検索し、次に全体またはレベル0の増分バックアップ内のブロックを検索します。Recovery Managerは、完全な状態に近いコピーを検出すると、それらをリストアし、ブロックに対してメディア・リカバリを実行します。ブロック・メディア・リカバリでは、レベル1の増分バックアップではなく、メディア・リカバリのREDOログのみを使用できます。

参照:

RECOVER ... BLOCK構文については、『Oracle Databaseバックアップおよびリカバリ・リファレンス』を参照してください。 

破損ブロックの識別

V$DATABASE_BLOCK_CORRUPTIONビューに、Recovery Manager、ANALYZEdbv、SQL問合せなどのデータベース・コンポーネントによって破損とマークされたブロックが表示されます。次のタイプの破損が、このビューに行として追加されます。

データベースは、ブロックとセグメント間の関係を検証することによって一部の破損を検出することはできますが、個々のブロックのチェックによって検出することはできません。V$DATABASE_BLOCK_CORRUPTIONビューに、このタイプの破損は記録されません。

ブロック・リカバリ時に欠落しているREDO

データファイルのメディア・リカバリと同様に、ブロック・メディア・リカバリでも通常は、アーカイブ・ログが欠落しているか、またはアクセスできない場合はリカバリを実行できませんただし、アーカイブREDOログ・ファイルの使用可能なコピーが検出された場合は、リストア・フェイルオーバーが試行されます(「リストア・フェイルオーバー」を参照)。また、ブロック・メディア・リカバリでは、チェックサム障害となる物理的なREDOの破損がある場合はリカバリを実行できません。ただし、ブロック・メディア・リカバリでは、REDOストリームが連続していない場合に、欠落または破損しているREDOレコードがリカバリするブロックに影響しなければ、リカバリを実行できます。データファイルのリカバリには、リカバリの開始から終了まで連続した一連のREDO変更が必要ですが、ブロック・メディア・リカバリでは、リカバリするブロックに対してのみ、連続した一連のREDO変更が必要です。


注意:

ブロック・メディア・リカバリ中、各ブロックは別々にリカバリされるため、一部のブロックでのみリカバリが正常に行われる場合があります。 


Recovery Managerは、ブロック・メディア・リカバリ中に欠落または破損しているREDOレコードを初めて検出した際、すぐにはエラーを通知しません。これは、リカバリ中のブロックがこの後のREDOストリームで更新ブロックになる場合があるためです。ブロックが更新されると、それ以前のREDOはブロックの古いインカネーションに適用されていたことになるため、それまでのすべてのREDOは無関係になります。たとえば、ユーザーが表を削除するか、または切り捨ててから、ブロックを他のデータに対して使用した場合、データベースはブロックを更新できます。

次の図に示すように、メディア・リカバリがブロック13で実行されるとします。

図18-1    Recovery Managerのメディア・リカバリの実行


画像の説明

ブロック・リカバリの開始後、Recovery Managerは、変更120がREDOストリームから欠落していることを検出します。ログ・ブロックが破損しているか、またはログを検出できないためです。ブロック13はこの後のREDOストリームで更新される可能性があるため、Recovery Managerはリカバリを続行します。変更140で、ユーザーが、ブロック13に格納されているemployees表を削除し、このブロックで新しい表を割り当て、新しい表にデータを挿入したとします。この時点で、データベースはブロック13を新しいブロックとしてフォーマットします。これで、更新操作の前の一部のREDOが欠落していた場合でも、このブロックでリカバリを続行できるようになります。

ブロック・メディア・リカバリの前提条件

次の前提条件がRECOVER ... BLOCKコマンドに適用されます。

個々のブロックのリカバリ

通常、ブロック破損は次の場所に表示されます。

たとえば、ユーザー・トレース・ファイルに次のメッセージが表示される場合があります。

ORA-01578: ORACLE data block corrupted (file # 7, block # 3)
ORA-01110: data file 7: '/oracle/oradata/trgt/tools01.dbf'
ORA-01578: ORACLE data block corrupted (file # 2, block # 235)
ORA-01110: data file 2: '/oracle/oradata/trgt/undotbs01.dbf'

次の手順では、リカバリが必要なブロックを識別し、使用可能なすべてのバックアップを使用してこれらのブロックのリストアおよびリカバリを実行します。

特定のデータ・ブロックをリカバリする手順
  1. 破損ブロックのデータファイル番号およびブロック番号を取得します。

    トレース・ファイルおよびアラート・ログを検索する最も簡単な方法は、SQL*Plusをターゲット・データベースに接続し、次の問合せを実行する方法です。

    SELECT NAME, VALUE 
    FROM   V$DIAG_INFO;
    
    
  2. Recovery Managerを起動し、ターゲット・データベースに接続します。ターゲット・データベースは、マウントまたはオープンされている必要があります。

  3. SHOW ALLコマンドを実行して、適切なチャネルが事前構成されていることを確認します。

  4. Recovery Managerプロンプトで、ファイルおよび破損ブロックのブロック番号を指定してRECOVER ... BLOCKコマンドを実行します。

    次の例では、2つのブロックをリカバリします。

    RECOVER 
      DATAFILE 8 BLOCK 13 
      DATAFILE 2 BLOCK 19;
    
    

    Recovery Managerの動作を制御する様々なオプションを指定することもできます。次の例は、ブロックの検索時にタグmondayamが含まれているバックアップのみが使用されることを示しています。FROM BACKUPSETオプションを使用して、Recovery Managerによって検索されるバップアップのタイプを制限できます。または、EXCLUDE FLASHBACK LOGを使用して、Recovery Managerによるフラッシュバック・ログの検索を制限できます。

    RECOVER 
      DATAFILE 8 BLOCK 13 
      DATAFILE 2 BLOCK 199
      FROM TAG mondayam;
    

V$DATABASE_BLOCK_CORRUPTION内のすべてのブロックのリカバリ

この例では、Recovery ManagerがV$DATABASE_BLOCK_CORRUPTIONビューに表示されているすべてのブロックを自動的にリカバリします。

V$DATABASE_BLOCK_CORRUPTIONに記録されているすべてのブロックをリカバリする手順
  1. SQL*Plusを起動し、ターゲット・データベースに接続します。

  2. V$DATABASE_BLOCK_CORRUPTIONを問い合せて、破損ブロックが存在するかどうかを確認します。たとえば、次の文を実行します。

    SQL> SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
    
    
  3. Recovery Managerを起動し、ターゲット・データベースに接続します。

  4. V$DATABASE_BLOCK_CORRUPTION内の破損とマークされたすべてのブロックをリカバリします。

    次のコマンドを実行すると、ビューに記録された物理的に破損しているすべてのブロックが修復されます。

    RMAN> RECOVER CORRUPTION LIST;
    
    

    ブロックは、修復された後、データベースによってV$DATABASE_BLOCK_CORRUPTIONから削除されます。

    参照:

    RECOVER ... BLOCKコマンドについては、『Oracle Databaseバックアップおよびリカバリ・リファレンス』を参照してください。 


戻る 次へ
Oracle
Copyright © 2003, 2008, Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引