この章では、データファイル内の個々のデータ・ブロックをリストアおよびリカバリする方法について説明します。この章の内容は次のとおりです。
この項では、ブロック・メディア・リカバリの目的および基本的な概念について説明します。
ブロック・メディア・リカバリを使用すると、データファイル内の1つ以上の破損したデータ・ブロックをリカバリできます。ブロック・メディア・リカバリには、データファイルのメディア・リカバリにはない次のようなメリットがあります。
リカバリが必要なブロックのみがリストアおよびリカバリされるため、平均リカバリ時間(MTTR)が短くなります。
リカバリ中、影響を受けるデータファイルをオンラインのままにしておくことができます。
ブロック・メディア・リカバリを使用しないと、1つのブロックが破損した場合でも、データファイルをオフラインにしてデータファイルのバックアップをリストアする必要があります。バックアップの作成後にデータファイルに対して生成されたすべてのREDOを適用する必要があります。メディア・リカバリが完了するまで、ファイル全体が使用不可となります。ブロック・メディア・リカバリを使用すると、実際にリカバリされているブロックのみがリカバリ中に使用不可となります。
ブロック・メディア・リカバリは、ブロックが少数でその数がわかっている場合に発生する物理的な破損の問題に特に有効です。ブロックレベルのデータ消失は、通常、広範囲なデータ消失は引き起こさない断続的でランダムなI/Oエラーや、破損したメモリーがディスクに書き込まれることが原因で発生します。ブロック・メディア・リカバリは、データの消失または破損の程度が不明で、データファイル全体のリカバリが必要な場合には適していません。このような場合は、データファイルのメディア・リカバリが最適です。
通常、データベースは、破損が最初に発生したときに、ブロックをメディア破損とマークし、ディスクに書き込みます。それ以降のブロックの読取りは、ブロックがリカバリされるまで正常に実行できません。ブロック・リカバリは、破損とマークされたブロックまたは破損チェックが失敗したブロックに対してのみ実行できます。
破損が発生したデータベースがリアルタイム問合せのフィジカル・スタンバイ・データベースに関連付けられている場合、データベースは、自動的にブロック・メディア・リカバリを実行します。プライマリ・データベースは、スタンバイ・データベースで完全な状態に近いブロックのコピーを検索し、見つかった場合は、破損ブロックが発生した問合せに影響を与えることなくブロックを修復します。データベースが破損を修復できない場合のみ、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 コマンドなどによって、検証中に破損ブロックが検出された場合、リカバリは自動的に開始されません。 |
関連項目:
|
V$DATABASE_BLOCK_CORRUPTION
ビューに、RMAN、ANALYZE
、dbv
、SQL問合せなどのデータベース・コンポーネントによって破損とマークされたブロックが表示されます。次のタイプの破損が、このビューに行として追加されます。
物理的な破損(メディア破損とも呼ばれる)
ブロックがデータベースで認識されません。チェックサムが無効か、ブロックの内容がすべて0(ゼロ)か、またはブロック・ヘッダーが破損しています。
物理的な破損のチェックは、デフォルトで有効になっています。BACKUP
コマンドのNOCHECKSUM
オプションを指定することによってチェックサムのチェックを無効にすることはできますが、ブロック・ヘッダーやフッターのチェックなどの他の物理的な一貫性チェックを無効にすることはできません。
論理的な破損
ブロックのチェックサムが有効で、ヘッダーとフッターが一致している点などは正常ですが、内容が論理的に一貫性のない状態になっています。ブロック・メディア・リカバリでは、すべての論理ブロック破損を修復できない場合があります。これらの場合、表領域のPoint-in-Timeリカバリなどの代替リカバリ方法、または影響を受けたオブジェクトの削除と再作成によって破損を修復する場合があります。
論理的な破損のチェックは、デフォルトでは無効になっています。BACKUP
、RESTORE
、RECOVER
およびVALIDATE
コマンドのCHECK
LOGICAL
オプションを指定することによって、有効にすることができます。
データベースは、ブロックとセグメント間の関係を検証することによって一部の破損を検出することはできますが、個々のブロックのチェックによって検出することはできません。V$DATABASE_BLOCK_CORRUPTION
ビューには、この粒度レベルでは記録されません。
データファイルのメディア・リカバリと同様に、ブロック・メディア・リカバリでも通常は、アーカイブ・ログが欠落しているか、またはアクセスできない場合はリカバリを実行できません。ただし、アーカイブ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が欠落していた場合でも、このブロックでリカバリを続行できるようになります。
次の前提条件がRECOVER ... BLOCK
コマンドに適用されます。
ターゲット・データベースがARCHIVELOG
モードで実行されており、現行の制御ファイルを使用してオープンまたはマウントされている必要があります。
ターゲット・データベースがスタンバイ・データベースの場合は、データベースが一貫性のある状態で、リカバリが開始されておらず、バックアップは破損したファイルよりも古いものである必要があります。
破損ブロックが含まれているデータファイルのバックアップは、プロキシ・コピーではなく全体またはレベル0のバックアップである必要があります。
プロキシ・コピー・バックアップのみが存在する場合は、それらをディスク上のデフォルト以外の場所にリストアできます。この場合、RMANは、プロキシ・バックアップをデータファイルのコピーとみなして、ブロック・メディア・リカバリ中にプロキシ・バックアップ内のブロックを検索します。
RMANは、リカバリでアーカイブREDOログのみを使用できます。
RMANは、レベル1の増分バックアップを使用できません。ブロック・メディア・リカバリでは、アーカイブREDOログが欠落しているか、またはアクセスできない場合はリカバリを実行できません。ただし、REDOレコードが欠落している場合はリカバリを実行できる場合もあります。
RMANがフラッシュバック・ログで破損ブロックの完全な状態に近いコピーを検索するには、フラッシュバック・データベースがターゲット・データベースで有効になっている必要があります。
破損していない古いバージョンの破損ブロックが含まれている場合にフラッシュバック・ロギングが有効になっていると、RMANは、それらのブロックを使用し、リカバリに必要な時間を短縮できます。
RMANがデータベースで破損ブロックの完全な状態に近いコピーを検索するには、ターゲット・データベースがリアルタイム問合せのフィジカル・スタンバイ・データベースに関連付けられている必要があります。
通常、ブロック破損は次の場所に表示されます。
LIST FAILURE
、VALIDATE
またはBACKUP ... VALIDATE
コマンドの結果
標準出力のエラー・メッセージ
アラート・ログ
ユーザー・トレース・ファイル
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'
次の手順では、リカバリが必要なブロックを識別し、使用可能なすべてのバックアップを使用してこれらのブロックをリストアおよびリカバリします。
特定のデータ・ブロックをリカバリする手順
破損ブロックのデータファイル番号およびブロック番号を取得します。
トレース・ファイルおよびアラート・ログを検索する最も簡単な方法は、SQL*Plusをターゲット・データベースに接続し、次の問合せを実行する方法です。
SELECT NAME, VALUE FROM V$DIAG_INFO;
RMANを起動し、ターゲット・データベースに接続します。ターゲット・データベースは、マウントまたはオープンされている必要があります。
SHOW ALL
コマンドを実行して、適切なチャネルが事前構成されていることを確認します。
RMANプロンプトで、ファイルおよび破損ブロックのブロック番号を指定してRECOVER ... BLOCK
コマンドを実行します。
次の例では、2つのブロックをリカバリします。
RECOVER DATAFILE 8 BLOCK 13 DATAFILE 2 BLOCK 19;
RMANの動作を制御する様々なオプションを指定することもできます。次の例は、ブロックの検索時にタグmondayam
が含まれているバックアップのみが使用されることを示しています。FROM BACKUPSET
オプションを使用して、RMANによって検索されるバックアップのタイプを制限できます。または、EXCLUDE FLASHBACK LOG
オプションを使用して、RMANによるフラッシュバック・ログの検索を制限できます。
RECOVER DATAFILE 8 BLOCK 13 DATAFILE 2 BLOCK 199 FROM TAG mondayam;
この例では、RMANがV$DATABASE_BLOCK_CORRUPTION
ビューに表示されているすべてのブロックを自動的にリカバリします。
V$DATABASE_BLOCK_CORRUPTIONに記録されているすべてのブロックをリカバリする手順
SQL*Plusを起動し、ターゲット・データベースに接続します。
V$DATABASE_BLOCK_CORRUPTION
を問い合せて、破損ブロックが存在するかどうかを確認します。たとえば、次の文を実行します。
SQL> SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
RMANを起動し、ターゲット・データベースに接続します。
V$DATABASE_BLOCK_CORRUPTION
内の破損とマークされたすべてのブロックをリカバリします。
次のコマンドを実行すると、ビューに記録された物理的に破損しているすべてのブロックが修復されます。
RMAN> RECOVER CORRUPTION LIST;
ブロックは、修復された後、データベースによってV$DATABASE_BLOCK_CORRUPTION
から削除されます。
関連項目: RECOVER ... BLOCKコマンドの詳細は、『Oracle Databaseバックアップおよびリカバリ・リファレンス』 を参照してください。 |