Oracleで破損ブロックを修復する方法

Oracle Master Gold

Oracleデータベースにおいてデータブロックの破損(Block Corruption)が発生した場合、RMAN(Recovery Manager)を使用することで、破損箇所を正確に特定し、バックアップから効率的に修復することが可能です。本記事では、VALIDATE DATABASE による検出と RECOVER CORRUPTION LIST による自動修復の手順を解説します。

RMANで障害直前まで完全リカバリする方法
Oracleデータベースの運用において、ディスク障害や誤操作によるデータ損失はいつでも起こり得ます。そんな「いざという時」に頼れるのが、Oracle標準のバックアップ・リカバリツール「RMAN(Recovery Manager)」です。この…

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

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

1. 破損ブロックの検出

まず、データベース全体をスキャンし、物理的・論理的な破損があるかどうかを確認します。

全データベースの検証

RMAN> VALIDATE DATABASE;

このコマンドにより、破損しているブロック情報が V$DATABASE_BLOCK_CORRUPTION ビューに自動登録されます。

破損状況の確認

破損箇所の詳細(ファイル番号やブロック番号)を確認するには、以下のSQLを実行します。

SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
RMAN> VALIDATE DATABASE;

validateを25-03-10で開始しています
チャネルORA_DISK_1の使用
チャネルORA_DISK_1: データファイルの検証を開始しています
チャネルORA_DISK_1: 検証のためのデータファイルを指定しています
入力データファイル ファイル番号=00001 名前=/u01/app/oracle/oradata/V19/system01.dbf
入力データファイル ファイル番号=00004 名前=/u01/app/oracle/oradata/V19/undotbs01.dbf
入力データファイル ファイル番号=00003 名前=/u01/app/oracle/oradata/V19/sysaux01.dbf
入力データファイル ファイル番号=00005 名前=/u01/app/oracle/oradata/V19/test_tbs.dbf
入力データファイル ファイル番号=00007 名前=/u01/app/oracle/oradata/V19/users01.dbf
チャネルORA_DISK_1: 検証が完了しました。経過時間: 00:00:15
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
1 OK 0 18147 149764 2273952
ファイル名: /u01/app/oracle/oradata/V19/system01.dbf
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 81289
Index 0 13395
Other 0 36929

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
3 OK 0 18718 88330 2274032
ファイル名: /u01/app/oracle/oradata/V19/sysaux01.dbf
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 6626
Index 0 2677
Other 0 60299

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
4 OK 0 553 92800 2274032
ファイル名: /u01/app/oracle/oradata/V19/undotbs01.dbf
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 0
Index 0 0
Other 0 92247

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
5 FAILED 0 4609 12800 2273949
ファイル名: /u01/app/oracle/oradata/V19/test_tbs.dbf
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 7935
Index 0 0
Other 1 256

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
7 OK 0 101 641 1252497
ファイル名: /u01/app/oracle/oradata/V19/users01.dbf
Block Type Blocks Failing Blocks Processed
---------- -------------- ----------------
Data 0 60
Index 0 15
Other 0 464

検証により1つ以上の破損したブロックが見つかりました
詳細はトレース・ファイル/u01/app/oracle/diag/rdbms/v19/v19/trace/v19_ora_2652.trcを参照してください
チャネルORA_DISK_1: データファイルの検証を開始しています
チャネルORA_DISK_1: 検証のためのデータファイルを指定しています
現行の制御ファイルを検証に組み込んでいます
バックアップ・セットに現行のSPFILEを組み込んでいます
チャネルORA_DISK_1: 検証が完了しました。経過時間: 00:00:01
List of Control File and SPFILE
===============================
File Type Status Blocks Failing Blocks Examined
------------ ------ -------------- ---------------
SPFILE OK 0 2
Control File OK 0 646
validateを25-03-10で終了しました

RMAN> SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;

FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO CON_ID
---------- ---------- ---------- ------------------ --------- ----------
5 140 1 0 ALL ZERO 0

RMAN> RECOVER CORRUPTION LIST; ★破損ブロックを修復

recoverを25-03-10で開始しています
チャネルORA_DISK_1の使用

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

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

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

RMAN> SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;


行が選択されていません

2. 破損ブロックの修復(自動修復)

V$DATABASE_BLOCK_CORRUPTION ビューにリストアップされた破損ブロックを、RMANが保持しているバックアップを使用して一括で修復します。

自動修復の実行

RMAN> RECOVER CORRUPTION LIST;

このコマンドを実行すると、RMANはビュー上の全破損ブロックに対し、バックアップからのリストアとメディアリカバリを自動的に行います。

修復結果の確認

修復完了後、再度ビューを確認します。「行が選択されていません」と表示されれば、正常に修復されています。

SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;

3. その他の修復手順

RECOVER CORRUPTION LIST で対処できない場合、状況に応じて以下のコマンドを使い分けます。

  • 特定のブロックのみを修復する場合BashRMAN> RECOVER DATAFILE 4 BLOCK 100;
  • データファイル単位で復旧する場合(被害が甚大な場合)BashRMAN> RESTORE DATAFILE 4; RMAN> RECOVER DATAFILE 4;

4. 破損を未然に防ぐ予防策

破損リスクを最小限にするため、以下のパラメータ設定と運用を推奨します。

パラメータの設定

  • DB_BLOCK_CHECKSUM: 書き込み時の破損検出を有効化します。SQLALTER SYSTEM SET DB_BLOCK_CHECKSUM=TYPICAL SCOPE=BOTH;
  • DB_BLOCK_CHECKING: ブロック内部の整合性チェックを有効化します。SQLALTER SYSTEM SET DB_BLOCK_CHECKING=TYPICAL SCOPE=BOTH;

定期運用

  • RMANによる定期バックアップ:BashRMAN> BACKUP DATABASE PLUS ARCHIVELOG;

5. よくある質問(FAQ)

Q1. RECOVER CORRUPTION LIST は本番環境で実行しても大丈夫ですか? A. はい。必要なブロックのみを修復するため、ファイル全体をオフラインにする必要はありません。ただしI/O負荷がかかるため、運用時間外の実行を推奨します。

Q2. 修復に失敗した場合はどうすればよいですか? A. データファイル全体をリストア(RESTORE)し、アーカイブログを適用してリカバリを行ってください。

Q3. V$DATABASE_BLOCK_CORRUPTION ビューが空にならないのですが? A. まだ修復できていないブロックが存在します。個別の RECOVER DATAFILE ... BLOCK ... を試してください。


まとめ

  • VALIDATE DATABASE で破損をスキャンし、ビューで詳細を確認する。
  • RECOVER CORRUPTION LIST でバックアップを用いた自動修復を実行する。
  • パラメータ設定定期バックアップで、破損リスクを未然に管理する。

本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。


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

Oracle RMAN バックアップのやり方と基本コマンド
Oracle データベースの運用において、データの保護は最優先事項です。Oracle RMAN(Recovery Manager)は、効率的なOracle バックアップと迅速なリカバリを実現するための標準ツールです。本記事では、初心者から中…

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

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

コメント

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