現在地

ブロック破損発生時の診断ツールやブロック破損検出に有効なパラメータ

*以下は、サポート契約締結中のお客さまに2018年12月に配信したサポートレターより一部抜粋して掲載しています。

はじめに

私自身サポート・エンジニアとしてのキャリアはまだまだ浅いのですが、お客様から問合せを受け付けた際、そのご質問の内容に "ブロック破損(ORA-1578 や ORA-600)" といった文言が含まれると、「これは手ごわいインシデントになるぞ」と、身の引き締まる思いがします。サポートの立場である私が、そのような感覚に陥るという事は、実際に本番環境などでブロック破損に遭遇された現場エンジニアの方は、かなりの焦燥感に駆られるのではないかと推測します。ブロック破損の原因はハードウェア故障、ソフトウェアの不具合など様々ですが、残念ながら、ブロック破損を 100% 未然に防ぐといった事はできません。今回は実際にブロック破損が発生した際に役立つ、Oracle Database の診断ツールやブロック破損検出に有効なパラメータについてご紹介致します。

ブロック破損の種類

一口にブロック破損といっても Oracle Database には、ブロック破損の検出ロジックによって、物理破損と論理破損の 2種類が存在します。

物理破損
物理破損はブロックのヘッダー(キャッシュ・レイヤー)の整合性が取れなかったり、無効なチェックサムを検出された状況のブロック破損となります。メディア破損とも呼ばれており、物理破損が発生すると、そのブロックは Oracle Database の有効なブロックとして認識されなくなります。
通常、物理破損が発生したブロックにアクセスすると ORA-1578 が発生します。
論理破損
論理破損はブロックのコンテンツ(データ・レイヤー)において不整合を検出されるブロック破損です。つまり、ブロックのヘッダー以降のデータ構造が破損した場合に発生しますので、ブロックのチェックサムは正常であっても、ブロックのコンテンツに論理的な一貫性がない状況となります。
通常、論理破損が発生したブロックにアクセスすると ORA-600 や ORA-7445 が発生します。

バッファー・キャッシュとディスク間でブロックの読み書きが行われる際に Oracle Database では、ブロックのバージョン、アドレス、チェックサムを利用して、上述の物理破損が発生していないか常時チェックを行っています。そのため、物理破損を検出するためにパラメータを設定したり、コマンドやプロシージャを実行する必要はありません。
一方、ブロックの論理破損を検出するために Oracle Database では dbverify などの診断ツールや db_block_checking といった論理破損を検出するパラメータが用意されています。以降で具体的な診断ツールとパラメータをご紹介します。

ブロック破損時の診断ツール

ブロック障害のエラーが発生した場合、破損がディスク上で発生しているのか、また他のブロックでも破損が波及していないかを確認する必要があります。Oracle Database ではブロック障害を確認する方法として、以下のような診断ツールが用意されています。

  1. dbverify ユーティリティ
  2. RMAN の validate コマンド
  3. analyze validate structure コマンド

dbverify ユーティリティやRMAN の validate コマンドは基本的にデータ・ファイル単位でのチェックを行い、analyze validate structure コマンドはオブジェクト単位でのチェックが可能となっています。各診断ツールの概要は以下の通りです。

1. dbverify ユーティリティ

dbverify ユーティリティは以下のコマンドを実行する事で、データ・ファイルまたはセグメントの検査を行う事が出来ます。

$ dbv file=test01.dbf blocksize=8192

dbverify でデータ・ファイルのチェックを行った場合はデータ・ファイル内の全てのブロックをチェックしますので、チェックにかかる時間は実際のデータ・ファイルのサイズに依存します。また、全てのブロックをチェックする関係上、オブジェクトに割当てられていないブロックやオブジェクトの HWM 以降のブロックで破損を検出される可能性があります。dbverify により、ブロック破損が検出された場合は、該当のブロック番号からそのブロックが実際に利用されているブロックなのか確認して下さい。

2. RMAN の validate コマンド

Oracle Database 11.1 以降のバージョンであれば、RMAN の validate コマンドを用いてデータベース全体、データ・ファイルのブロック破損の検出を行う事が出来ます。

RMAN> validate database

具体的には上記コマンドを実行しますと、検査結果のサマリーが標準出力され、破損が検出された場合はトレース・ファイルに詳細情報が出力されます。
(V$DATABASE_BLOCK_CORRUPTION にも破損ブロックの情報が格納されます。)
具体的な利用方法や仕様については、以下ドキュメントもご参照下さい。

参考ドキュメント

  • [Oracle 11g] RMAN の VALIDATE コマンド(KROWN:133540) (ドキュメントID 1745489.1)

3. analyze validate structure コマンド

ブロック破損が発生しているオブジェクトが特定できている場合、オブジェクト単位で実行可能な analyze validate structure コマンドによる検査がお勧めです。

SQL> analyze table test validate structure cascade;

analyze validate structure コマンドは、先の dbverify ユーティリティとは異なり、オブジェクトの HWM までのブロックの論理破損をチェックします。表またはクラスタのチェックを行う場合、上述のコマンド例のように cascade オプションを付与する事で、関連する索引オブジェクトのチェックも行ってくれます。
尚、コマンド実行の結果、破損が検出された場合は論理ブロック・ダンプを含む詳細情報がトレース・ファイルに出力されます。

論理破損を検出するパラメータ

上述の診断ツールは何かしらのブロック破損に関するエラーを検知したタイミングで、担当エンジニアの方がチェック(診断)をする仕組みとなりますが、db_block_checking パラメータを利用すると、表や索引のブロックが更新されたタイミングやディスクに書き込まれるタイミングに、論理破損が発生していないか、Oracle Database が内部的に確認を行う動作に設定する事ができます。
db_block_checking パラメータにより、ブロック更新時に論理破損を検出すると、直ちにエラーを発生するようになり、また、破損が検出されたブロックは、アクセスした際に内部エラーが発生したり、それ以上のデータベース破損を引き起こしたりすることを避けるために、ソフト破損としてマークされますので、以降、DML 文でそのブロックを更新することはできなくなります。(マークされたブロックにアクセスすると ORA-1578 が発生して SQL 文の処理が失敗する動作となります。)
ブロック破損が発生した際の影響を最小限に抑える事が出来るパラメータですが、チェックのためのオーバヘッドが発生しパフォーマンス面での影響がありますので、既に稼動中の DB にて db_block_checking パラメータの設定を有効化する際はご注意下さい。
尚、db_block_checking パラメータが false/off に設定されていても SYSTEM 表領域のブロックに対しては更新時に論理破損のチェックが行われます。
また、このパラメータはブロックの更新時のみに影響を与えるものですので、例えば、全表スキャンのような問合せを行っても、ブロックの論理破損を検出したり、ソフト破損のマークがされるといった事はありません。

本トピックでは、ブロック破損の検出に主眼を置いて、db_block_checking パラメータを紹介致しましたが、他にも予防や回避に役立つパラメータもございますので、詳細については、以下ドキュメントもご参考にして頂ければと思います。

参考ドキュメント

  • 破損の検知と回避のためのベストプラクティス (ドキュメントID 1671620.1)
  • ブロックの物理的破損と論理的破損について (ドキュメントID 2234872.1)
  • ブロックのソフト破損について (ドキュメントID 2234869.1)

ブロック破損時の対処方法について

一般的に実際にブロック破損が発生した際、まずはアラート・ログなどから、ブロック破損によるエラーがいつ頃から発生し始めたかなどを特定し、他のブロックでも破損が発生していないか上述の診断ツールを使用して確認するといった対応が必要となります。
また、OS や ハードウェアレベルでも問題が発生していないかといった観点も重要となります。調査の結果、ディスク上のブロックが破損していると判断された場合、もっとも有効な対処方法はメディア・リカバリとなりますが、原因を究明するためにはリストア前にブロック・ダンプを取得するといった配慮も必要です。実際にブロック破損を検知した際には、その状況に応じて、対応方針も変わってきますので、有事の際は是非、当サポートセンターにご連絡・ご相談頂ければと存じます。

まとめ

今回は Oracle Database のブロック破損発生時の診断ツールやブロック破損検出に有効なパラメータについて、ご紹介させて頂きました。リカバリを伴うようなトラブルは発生しないに越した事は無いですが、有事の際に本トピックがお役立てば幸いです。

(オラクル事業部 サポート・サービス担当 高山)