データベースの停止は、データ駆動型の組織にとって非常にコストがかかり、ビジネスがほぼ停止します。 データベースの停止の最も一般的な原因の1つは、データブロックの破損です。 この記事では、Oracleデータベース内のブロック破損の問題を検出および修復する方法について説明します。
データブロックの破損とは何ですか?
データブロックの破損は、データが予期された状態にない場合に発生します。 ブロックの内容が内部的に一貫していないか、Oracle Database形式の一部として認識できないように変更されている可能性があります。
一部のデータブロックの破損は比較的軽微であり、単一のブロックにのみ影響します。 他の人は、データベースのかなりの部分を破損し、使用できなくなり、重要な情報が失われる可能性があります。
なぜデータブロックの破損が発生するのですか?
データブロックの破損は、データが変更されるたびに発生する可能性があり、ハードウェアとソフトウェアの両方の問題にさかのぼることができます。 次のコンポーネントのいずれかまたはすべてに問題があると、データブロックが破損する可能性があります:
- ハードドライブ
- ディスクコントローラ
- オペレーティングシステム
- ストレージエリアネットワーク(SAN)
- ストレージデバイス
データブロックの破損
データブロックの破損は、本質的に予測不可能であるため、防止することは困難です。 実際、今日の非常に複雑なデータベース環境では、破損は避けられません。
ただし、堅牢なバックアップとリカバリ戦略を使用すると、データブロックの破損の影響を軽減することができます。 オラクルは、これらの目的のために、次のようなさまざまなツールとソリ:
- Oracle Data Guard:災害や破損が発生した場合に、エンタープライズ-データベースを保護します。
- Data Recovery Advisor:データの損失または破損を診断し、修復を実行します。
- Oracle Flashback:データベース表または行を以前の状態に復元します。
- Oracle Recovery Manager:Oracleデータベースをバックアップおよびリカバリします。
- Oracle Secure Backup:ファイル・システム・データおよびOracle Databaseファイルをテープにバックアップします。
データブロックの破損をどのように検出および監視しますか。
最善の努力にもかかわらず、データブロックの破損はいつでも発生する可能性があります。 幸いなことに、Oracleはデータ-ブロックの破損を検出して修復する方法が複数あります:
- Oracle Recovery Manager(RMAN)
- DBVerify
- ANALYZEコマンド
- DB_BLOCK_CHECKINGパラメータ
- ブロック-メディア-リカバリ(BMR)
- DBMS_REPAIR
Oracle Recovery Manager(RMAN)
- バックアップ検証チェック論理データベースARCHIVELOG ALL;
Oracle RMANのVALIDATEコマンドを使用すると、ファイル、表領域、さらにはデータベース全体を検証できます。 例えば:
- データファイル’/u01/oradata/ORCL/system01を検証します。dbf’;
- テーブルスペースのユーザーの検証;
- データベースの検証;
ORACLE RMANがデータ・ブロックの破損を検出すると、それらはV$DATABASE_BLOCK_CORRUPTIONビューに表示されます。
DBVerify
DBVerifyは、バックアップを含むオンラインおよびオフラインのデータベースおよびファイルを検証するための外部コマンドラインユーティリティです。 次の例は、dbvコマンドの使用方法を示しています:
- dbvファイル=/u01/oradata/ORACL/system01.dbfフィードバック=10000ブロックサイズ=8192
Oracle制御ファイルまたはredoログにはDBVerifyを使用できないことに注意してください。
ANALYZEコマンド
ANALYZE…VALIDATE構造の構築を使用して、オブジェクト内のデータブロックを検証できます。 分析が完了したら、INVALID_ROWSテーブルをチェックして、破損したデータを確認します。
最初にINVALID_ROWSテーブルを作成するには、SQL内で次のコマンドを実行します:
- @$ORACLE_HOME/rdbms/admin/UTLVALIDです。SQL
次に、次のコマンドを使用してテーブルとインデックス構造を検証します:
- テーブルを分析します。empの検証構造のカスケード;
DB_BLOCK_CHECKINGパラメータ
DB_BLOCK_CHECKINGパラメータをに設定すると、Oracle checkデータベース・ブロックに自己整合性を持たせることができます。 これにより、サーバーへのオーバーヘッドが最大10%になる可能性があるため、パフォーマンスがあまり重要でない場合にのみこのオプションを使用してくださ
Block media recovery(BMR)
Block media recovery(BMR)を使用すると、ファイル全体に影響を与えることなく、一つ以上のデータブロックをリカバリできます。 その結果、影響を受けるブロックをオフラインにするだけで済むため、平均修復時間(MTTR)が低くなり、可用性が向上します。
この戦術は、限られた数のデータブロックだけが破損している場合に便利です。 BMRは、BLOCKRECOVERコマンドを使用してORACLE RMAN内でのみ実行できます。
DBMS_REPAIR
OracleのDBMS_REPAIRパッケージは、破損の検出と修復の両方が可能です。 これを行うには、最初に2つの管理表を作成する必要があります。 これらのテーブルには、破損したブロックのリストと、それらのブロックを指すインデックスキーが含まれます:
DBMS_REPAIRを開始します。テーブル名=
テーブル名=>’REPAIR_TABLE’,
テーブル名=>DBMS_REPAIR.repair_table,
action=>DBMS_REPAIR.テーブルスペース=>’ユーザー’);
DBMS_REPAIR.テーブル名=>’ORPHAN_KEY_TABLE’,
table_type=>DBMS_REPAIR.テーブル名=>’ORPHAN_KEY_TABLE’,
table_type=>DBMS_REPAIR.テーブル名=>’ORPHAN_KEY_TABLE’,
table_type=
アクション=>DBMS_REPAIR.create_action,
tablespace=>’USERS’);
END;
第二のステップは、テーブルを調べるためにCHECK_OBJECTプロシージャを使用することです:
設定SERVEROUTPUT ON
DECLARE
v_num_corrupt INT;
BEGIN
V_num_corrupt INT;
V_num_corrupt INT;
V_num_corrupt INT;
V_num_corrupt INT;:= 0;
DBMS_REPAIR.check_object(
schema_name=>’SCOTT’,
object_name=>’DEPT’,
repair_table_name=>’REPAIR_TABLE’,
corrupt_count=>v_num_corrupt);
dbms_output.put_line(‘number corrupt:’||TO_CHAR(v_num_corrupt));
END;
次に、fix_CORRUPT_BLOCKSプロシージャを使用して、破損したブロックをマークします:
設定SERVEROUTPUT ON
DECLARE
v_num_fix INT;
BEGIN
V_num_fix INT;
V_num_fix INT;
V_num_fix INT;
V_num_fix INT;:= 0;
DBMS_REPAIR.fix_corrupt_blocks(
schema_name=>’SCOTT’,
object_name=>’DEPT’,
object_type=>Dbms_Repair.テーブルオブジェクト
repair_table_name=>’REPAIR_TABLE’,
fix_count=>v_num_fix);
DBMS_OUTPUT.put_line(‘num fix:’||TO_CHAR(V_num_fix));
END;
次のステップは、破損したデータブロックを指すキーエントリである孤立キーをチェックすることです:
設定SERVEROUTPUT ON
DECLARE
v_num_orphans INT;
BEGIN
V_num_orphans INT;
BEGIN
V_num_orphans INT;
V_num_orphans INT;:= 0;
DBMS_REPAIR.dump_orphan_keys(
schema_name=>’SCOTT’,
object_name=>’PK_DEPT’,
object_type=>DBMS_REPAIR.インデックス_object,
repair_table_name=>’REPAIR_TABLE’,
orphan_table_name=>’ORPHAN_KEY_TABLE’,
key_count=>V_num_orphans);
DBMS_OUTPUT.put_line(‘orphan key count:’||TO_CHAR(v_num_orphans));
END;
1つ以上の孤立キーがある場合は、REBUILD_FREELISTSプロシージャを使用してデータベースインデックスを再構築する必要があります。
BEGIN
DBMS_REPAIR。
schema_name=>’SCOTT’,
object_name=>’DEPT’,
object_type=>DBMS_REPAIR.table_object);
END;
最後に、SKIP_CORRUPT_BLOCKSプロシージャを使用して、クエリ中に破損したブロックがスキップされるようにします。
BEGIN
DBMS_REPAIR。
schema_name=>’SCOTT’,
object_name=>’DEPT’,
object_type=>DBMS_REPAIR.テーブルオブジェクト、
フラグ=>DBMS_REPAIR。skip_flag);
END;
結論
データ-ブロックの破損は不幸な事実ですが、Oracleには、エンタープライズ-データを保護および回復するための成熟した幅広いツール-スイートがあります。 Oracle Data GuardやOracle RMANなどのソフトウェアを使用したり、定期的な破損チェックを実行したりすると、データ・ブロックの破損の問題に対処するのに役立ちます。