Oracle データブロック破損の検出と修復方法

Oracle Master Gold

Oracleデータベースでは、データブロックの破損が発生することがあります。データブロックの破損が発生すると、データの整合性が損なわれ、SQLの実行エラーやデータの損失につながる可能性があります。本記事では、データブロック破損の検出および修復方法について解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

1. データブロック破損の検出方法

データブロックの破損を検出するための主要なツールには、以下の3つがあります。

  1. DBVERIFY(物理ブロックの整合性チェック)
  2. DBMS_REPAIR(破損ブロックの管理・修復)
  3. ANALYZE VALIDATE STRUCTURE(破損ブロックの検出)

1.1 DBVERIFY を使用した物理ブロックの整合性チェック

DBVERIFY は、Oracleが提供するコマンドラインツールであり、データファイルの物理的な破損を検出するために使用されます。

使い方

$ dbv file=/u01/oradata/ORCL/users01.dbf

このコマンドを実行すると、指定したデータファイル (users01.dbf) に対してブロック破損のチェックが行われ、破損が検出されると報告されます。

出力例

DBVERIFY - Verification starting

Page 100 is marked corrupt
Page 101 is marked corrupt

DBVERIFY - Verification complete

このように、破損したページがある場合は報告されます。

1.2 DBMS_REPAIR を使用した破損ブロックの管理・修復

DBMS_REPAIR パッケージは、破損したブロックを特定し、適切な対処を行うために使用されます。

破損ブロックの特定

BEGIN
  DBMS_REPAIR.ADMIN_TABLES (
    TABLE_NAME   => 'REPAIR_TABLE',
    TABLE_TYPE   => DBMS_REPAIR.REPAIR_TABLE,
    ACTION       => DBMS_REPAIR.CREATE_ACTION
  );
END;
/

上記のPL/SQLブロックを実行すると、破損ブロックを記録するための REPAIR_TABLE が作成されます。

次に、テーブルの破損ブロックを検出します。

DECLARE
  v_corrupt_count NUMBER;
BEGIN
  DBMS_REPAIR.CHECK_OBJECT (
    SCHEMA_NAME  => 'SCOTT',
    OBJECT_NAME  => 'EMP',
    OBJECT_TYPE  => DBMS_REPAIR.TABLE_OBJECT,
    REPAIR_TABLE_NAME => 'REPAIR_TABLE',
    CORRUPT_COUNT => v_corrupt_count
  );
END;
/

REPAIR_TABLE に破損ブロックの情報が格納されます。

破損ブロックをスキップする設定

破損ブロックをスキップするための DBMS_REPAIR.SKIP_CORRUPT_BLOCKS を有効にします。

BEGIN
  DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
    SCHEMA_NAME  => 'SCOTT',
    OBJECT_NAME  => 'EMP',
    OBJECT_TYPE  => DBMS_REPAIR.TABLE_OBJECT,
    FLAGS        => DBMS_REPAIR.SKIP_FLAG
  );
END;
/

この設定を行うと、SQL 実行時に破損ブロックを自動的にスキップするようになります。

1.3 ANALYZE VALIDATE STRUCTURE を使用した破損ブロックの検出

Oracle では ANALYZE VALIDATE STRUCTURE コマンドを使用して、オブジェクト内の破損ブロックを特定することができます。

使い方

ANALYZE TABLE SCOTT.EMP VALIDATE STRUCTURE;

このコマンドを実行すると、DBA_TABLESDBA_OBJECTS に破損情報が記録されます。

破損がある場合、DBA_TAB_CORRUPTIONS ビューを確認できます。

SELECT * FROM DBA_TAB_CORRUPTIONS;

このビューに破損ブロックの情報が格納されている場合は、適切な修復措置を取る必要があります。

2. データブロック破損の修復方法

データブロックの破損が発見された場合、以下の方法で対応することができます。

  • DBMS_REPAIR を使用して破損ブロックをスキップする
  • RMAN(Recovery Manager)を使用してデータファイルをリカバリする
  • 破損したオブジェクトをエクスポート・インポートして再作成する

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

2.1 RMAN を使用した修復

RMAN を使用して破損したブロックを修復することも可能です。

RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 100,101;

このコマンドにより、データファイル 5 のブロック 100 および 101 を修復できます。

RMAN> SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO CON_ID
---------- ---------- ---------- ------------------ --------- ----------
5 140 1 0 ALL ZERO 0

RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 140;

recoverを25-03-10で開始しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=101 デバイス・タイプ=DISK

チャネルORA_DISK_1: ブロックをリストアしています
チャネルORA_DISK_1: バックアップ・セットからリストアするブロックを指定しています
データファイル00005のブロックをリストアしています
チャネルORA_DISK_1: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/013k0ttf_1_1_1から読取り中です
チャネルORA_DISK_1: ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/013k0ttf_1_1_1 タグ=TAG20250310T173439
チャネルORA_DISK_1: バックアップ・ピース1からブロックをリストアしました
チャネルORA_DISK_1: ブロックのリストアが完了しました。経過時間: 00:00:01

メディア・リカバリを開始しています
メディア・リカバリが完了しました。経過時間: 00:00:03

recoverを25-03-10で終了しました

RMAN> VALIDATE DATAFILE 5;

validateを25-03-10で開始しています
チャネルORA_DISK_1の使用
チャネルORA_DISK_1: データファイルの検証を開始しています
チャネルORA_DISK_1: 検証のためのデータファイルを指定しています
入力データファイル ファイル番号=00005 名前=/u01/app/oracle/oradata/V19/tbs24.dbf
チャネルORA_DISK_1: 検証が完了しました。経過時間: 00:00:01
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
5 OK 0 4609 12800 2273917
ファイル名: /u01/app/oracle/oradata/V19/tbs24.dbf
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 7936
Index 0 0
Other 0 255

validateを25-03-10で終了しました

2.2 破損テーブルをエクスポート・インポートする

もし破損が特定のテーブルに集中している場合、そのテーブルをエクスポートし、新しいテーブルとして再作成することで回避できる場合があります。

$ expdp scott/password tables=emp directory=DATA_PUMP_DIR dumpfile=emp.dmp

データをエクスポート後、破損したテーブルを削除し、新しいテーブルを作成してデータをインポートします。

$ impdp scott/password tables=emp directory=DATA_PUMP_DIR dumpfile=emp.dmp

3. まとめ

  • DBVERIFY はデータファイルの物理破損を検出するツール
  • DBMS_REPAIR は破損ブロックを検出し、スキップ設定が可能
  • ANALYZE VALIDATE STRUCTURE はオブジェクトレベルで破損を検出する
  • RMAN やエクスポート・インポートを使用して修復可能

Oracleデータベースの運用では、定期的にデータブロックの整合性をチェックし、早期に問題を検出することが重要です。ぜひ、本記事の方法を活用し、データの整合性を維持してください。

[参考]
Oracle Database バックアップおよびリカバリ・ユーザーズ・ガイド 19c

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました