19 ブロック・メディア・リカバリの実行
この章では、データファイル内の個々のデータ・ブロックをリストアおよびリカバリする方法について説明します。この章のトピックは、次のとおりです:
関連項目:
-
RECOVER
の構文については、『Oracle Databaseバックアップおよびリカバリ・リファレンス』を参照してください。 -
V$DATABASE_BLOCK_CORRUPTION
ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
19.1 ブロック・メディア・リカバリの概要
ブロック・メディア・リカバリでは、破損データ・ブロックをリカバリすることで、平均リカバリ時間(MTTR)が短くなります。
この項では、次の項目について説明します。
19.1.1 ブロック・メディア・リカバリの目的
ブロック・メディア・リカバリを使用して、データ・ファイル内の1つ以上の破損データ・ブロックをリカバリします。
ブロック・メディア・リカバリには、データファイルのメディア・リカバリにはない次のようなメリットがあります。
-
リカバリが必要なブロックのみがリストアおよびリカバリされるため、平均リカバリ時間(MTTR)が短くなります。
-
リカバリ中、影響を受けるデータファイルをオンラインのままにしておくことができます。
ブロック・メディア・リカバリを使用しないと、1つのブロックが破損した場合でも、データファイルをオフラインにしてデータファイルのバックアップをリストアする必要があります。バックアップの作成後にデータファイルに対して生成されたすべてのREDOを適用する必要があります。メディア・リカバリが完了するまで、ファイル全体が使用不可となります。ブロック・メディア・リカバリを使用すると、実際にリカバリされているブロックのみがリカバリ中に使用不可となります。
ブロック・メディア・リカバリは、ブロックが少数でその数がわかっている場合に発生する物理的な破損の問題に特に有効です。ブロックレベルのデータ消失は、通常、広範囲なデータ消失は引き起こさない断続的でランダムなI/Oエラーや、破損したメモリーがディスクに書き込まれることが原因で発生します。ブロック・メディア・リカバリは、データの消失または破損の程度が不明で、データファイル全体のリカバリが必要な場合には適していません。このような場合は、データファイルのメディア・リカバリが最適です。
19.1.2 ブロック・メディア・リカバリの基本的な概念
通常、データベースは、破損が最初に発生したときに、ブロックをメディア破損とマークし、ディスクに書き込みます。それ以降のブロックの読取りは、ブロックがリカバリされるまで正常に実行できません。ブロック・リカバリは、破損とマークされたブロックまたは破損チェックが失敗したブロックに対してのみ実行できます。
通常、ブロック破損は次の場所に表示されます。
-
LIST FAILURE
、VALIDATE
またはBACKUP ... VALIDATE
コマンドの結果 -
V$DATABASE_BLOCK_CORRUPTION
ビュー -
標準出力のエラー・メッセージ
-
アラート・ログ
-
ユーザー・トレース・ファイル
-
SQLコマンド
ANALYZE TABLE
およびANALYZE INDEX
の結果 -
DBVERIFYユーティリティの結果
-
サード・パーティのメディア管理の出力
たとえば、ユーザー・トレース・ファイルに次のメッセージが表示される場合があります。
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'
関連項目:
RECOVER ... BLOCK
の構文については、Oracle Databaseバックアップおよびリカバリ・リファレンスを参照してください
19.1.2.1 ブロック・リカバリおよびスタンバイ・データベースについて
ブロック・リカバリの動作は、データ・ブロックの破損がプライマリ・データベースまたはフィジカル・スタンバイ・データベースのどちらで検出されたかによって異なります。
破損が発生したデータベースがリアルタイム問合せのフィジカル・スタンバイ・データベースに関連付けられている場合、データベースは、自動的にブロック・メディア・リカバリを実行します。プライマリ・データベースは、スタンバイ・データベースで完全な状態に近いブロックのコピーを検索し、見つかった場合は、破損ブロックが発生した問合せに影響を与えることなくブロックを修復します。データベースが破損を修復できない場合のみ、Oracle Databaseの物理ブロック破損のメッセージ(ORA-1578
)が表示されます。
ブロックの破損が自動的に検出されると、RECOVER ... BLOCK
コマンドを使用してブロック・メディア・リカバリを手動で実行できます。デフォルトでは、RMANは、リアルタイム問合せのフィジカル・スタンバイ・データベース内の完全な状態に近いブロックを検索し、次にフラッシュバック・ログを検索してから、全体またはレベル0の増分バックアップ内のブロックを検索します。
ノート:
ブロック・メディア・リカバリを自動的に機能させるには、フィジカル・スタンバイ・データベースをリアルタイム問合せモードにする必要があります。Oracle Active Data Guardライセンスが必要です。
リアルタイム問合せのフィジカル・スタンバイ・データベースで破損データ・ブロックが検出された場合、サーバーは、プライマリ・データベースからブロックのコピーを取得することによって破損の修復を試行します。修復はバックグラウンドで行われ、正常に実行されると、それ以降の問合せが正常に実行されます。スタンバイ・データベースに、次のデータベース初期化パラメータが説明のように構成されている場合、自動ブロック修復が試行されます。
-
LOG_ARCHIVE_CONFIG
パラメータがDG_CONFIG
リスト付きで構成され、LOG_ARCHIVE_DEST_n
パラメータがDB_UNIQUE_NAME
属性付きでプライマリ・データベース用に構成されているまたは
-
FAL_SERVER
パラメータが構成され、その値にプライマリ・データベース用のOracle Netサービス名が含まれている
ノート:
RMANのVALIDATE
コマンドなどによって、検証中に破損ブロックが検出された場合、リカバリは自動的に開始されません。
関連項目:
-
RECOVER ... BLOCK
の構文については、Oracle Databaseバックアップおよびリカバリ・リファレンスを参照してください -
スタンバイ・データベースのリアルタイム問合せオプションについて学習するには、Oracle Data Guard概要および管理を参照してください。
19.1.2.2 破損ブロックの識別について
V$DATABASE_BLOCK_CORRUPTION
ビューに、RMAN、ANALYZE
、SQL問合せなどのデータベース・コンポーネントによって破損とマークされたブロックが表示されます。
次のタイプの破損が、このビューに行として追加されます。
-
物理的な破損(メディア破損とも呼ばれる)
ブロックがデータベースで認識されません。チェックサムが無効か、ブロックの内容がすべて0(ゼロ)か、またはブロック・ヘッダーが破損しています。
物理的な破損のチェックは、デフォルトで有効になっています。
BACKUP
コマンドのNOCHECKSUM
オプションを指定することによってチェックサムのチェックを無効にすることはできますが、ブロック・ヘッダーやフッターのチェックなどの他の物理的な一貫性チェックを無効にすることはできません。 -
論理的な破損
ブロックのチェックサムが有効で、ヘッダーとフッターが一致している点などは正常ですが、内容が論理的に一貫性のない状態になっています。ブロック・メディア・リカバリでは、すべての論理ブロック破損を修復できない場合があります。これらの場合、表領域のPoint-in-Timeリカバリなどの代替リカバリ方法、または影響を受けたオブジェクトの削除と再作成によって破損を修復する場合があります。
論理的な破損のチェックは、デフォルトでは無効になっています。
BACKUP
、RESTORE
、RECOVER
およびVALIDATE
コマンドのCHECK
LOGICAL
オプションを指定することによって、有効にすることができます。
データベースは、ブロックとセグメント間の関係を検証することによって一部の破損を検出することはできますが、個々のブロックのチェックによって検出することはできません。V$DATABASE_BLOCK_CORRUPTION
ビューには、この粒度レベルでは記録されません。
19.1.2.3 ブロック・リカバリ時に欠落しているREDOについて
ブロック・メディア・リカバリでは、リカバリされるブロックの破損していないREDO変更のセットのみが必要です。これは、リカバリの開始から終了までの一連の破損していないREDO変更が必要なデータ・ファイル・リカバリとは異なります。
データファイルのメディア・リカバリと同様に、ブロック・メディア・リカバリでも通常は、アーカイブ・ログが欠落しているか、またはアクセスできない場合はリカバリを実行できません。ただし、アーカイブREDOログ・ファイルの使用可能なコピーが検出された場合は、リストア・フェイルオーバーが試行されます。また、ブロック・メディア・リカバリでは、チェックサム障害となる物理的なREDOの破損がある場合はリカバリを実行できません。ただし、ブロック・メディア・リカバリでは、REDOストリームが連続していない場合に、欠落または破損しているREDOレコードがリカバリするブロックに影響しなければ、リカバリを実行できます。
ノート:
ブロック・メディア・リカバリ中、各ブロックは別々にリカバリされるため、一部のブロックでのみリカバリが正常に行われる場合があります。
RMANは、ブロック・メディア・リカバリ中に欠落または破損しているREDOレコードを初めて検出した際、すぐにはエラーを通知しません。これは、リカバリ中のブロックによってこの後のREDOストリームでブロックが作成される場合があるためです。ブロックが再作成されると、それ以前のREDOはブロックの古いインカネーションに適用されていたことになるため、それまでのすべてのREDOは無関係になります。たとえば、ユーザーが表を削除するか、または切り捨ててから、ブロックを他のデータに対して使用した場合、データベースは新しいブロックを作成します。
図19-1に示すように、メディア・リカバリがブロック13で実行されるとします。
ブロック・リカバリの開始後、RMANは、変更120がREDOストリームから欠落していることを検出します。ログ・ブロックが破損しているか、またはログを検出できないためです。ブロック13がこの後のREDOストリームで再作成される場合、RMANはリカバリを続行します。変更140で、ユーザーが、ブロック13に格納されているemployees
表を削除し、このブロックで新しい表を割り当て、新しい表にデータを挿入したとします。この時点で、データベースはブロック13を新しいブロックとしてフォーマットします。これで、再作成操作の前の一部のREDOが欠落していた場合でも、このブロックでリカバリを続行できるようになります。
関連項目:
19.2 ブロック・メディア・リカバリの前提条件
RECOVER ... BLOCK
コマンドを使用してブロック・メディア・リカバリを実行する前に、特定の前提条件を満たす必要があります。
次の前提条件があります。
-
ターゲット・データベースが
ARCHIVELOG
モードで実行されており、現行の制御ファイルを使用してオープンまたはマウントされている必要があります。 -
ターゲット・データベースがスタンバイ・データベースの場合は、データベースが一貫性のある状態で、リカバリが開始されておらず、バックアップは破損したファイルよりも古いものである必要があります。
-
破損ブロックが含まれているデータファイルのバックアップは、全体またはレベル0のバックアップである必要があります。プロキシ・コピーまたは増分バックアップは使用できません。
プロキシ・コピー・バックアップのみが存在する場合は、それらをディスク上のデフォルト以外の場所にリストアできます。この場合、RMANは、プロキシ・バックアップをデータファイルのコピーとみなして、ブロック・メディア・リカバリ中にプロキシ・バックアップ内のブロックを検索します。
-
RMANは、リカバリでアーカイブREDOログのみを使用できます。
RMANは、レベル1の増分バックアップを使用できません。ブロック・メディア・リカバリでは、アーカイブREDOログが欠落しているか、またはアクセスできない場合はリカバリを実行できません。ただし、REDOレコードが欠落している場合はリカバリを実行できる場合もあります。
-
RMANがフラッシュバック・ログで破損ブロックの完全な状態に近いコピーを検索するには、フラッシュバック・データベースがターゲット・データベースで有効になっている必要があります。
破損していない古いバージョンの破損ブロックが含まれている場合にフラッシュバック・ロギングが有効になっていると、RMANは、それらのブロックを使用し、リカバリに必要な時間を短縮できます。
-
RMANがデータベースで破損ブロックの完全な状態に近いコピーを検索するには、ターゲット・データベースがリアルタイム問合せのフィジカル・スタンバイ・データベースに関連付けられている必要があります。
19.3 個々のブロックのリカバリ
データ・ファイル内の個々の破損ブロックをリカバリするには、RECOVER...BLOCK
コマンドを使用します。
この項では、次の項目について説明します。
19.3.1 RECOVER...BLOCKコマンドを使用する個々のブロックのリカバリ
リカバリが必要なブロックを識別し、使用可能なすべてのバックアップを使用してこれらのブロックをリストアおよびリカバリします。
RECOVER...BLOCKコマンドを使用して特定のデータ・ブロックをリカバリするには:
19.4 V$DATABASE_BLOCK_CORRUPTION内のすべてのブロックのリカバリ
RMANはV$DATABASE_BLOCK_CORRUPTION
ビューに表示されているすべてのブロックを自動的にリカバリできます。
V$DATABASE_BLOCK_CORRUPTIONに記録されているすべてのブロックをリカバリするには:
関連項目:
RECOVER ... BLOCK
コマンドについて学習するには、Oracle Databaseバックアップおよびリカバリ・リファレンスを参照してください