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

Oracle Master Gold

Oracleデータベースにおいてブロックの破損が発生した場合、VALIDATE DATABASE コマンドを使用して破損ブロックを特定し、RECOVER CORRUPTION LIST コマンドを使用して修復することが可能です。本記事では、RMAN(Recovery Manager)を使用して破損ブロックの特定と修復を行う手順を解説します。

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

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

1. 破損ブロックの検出

まず、VALIDATE DATABASE コマンドを実行し、データベース全体の整合性をチェックします。

RMAN> VALIDATE DATABASE;

このコマンドを実行すると、Oracleはすべてのデータブロックをスキャンし、破損しているブロックを V$DATABASE_BLOCK_CORRUPTION ビューに記録します。

破損ブロックのリストを確認するには、以下のSQLを実行します。

SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;

このビューには、破損しているブロックの情報(ファイルID、ブロックID、破損タイプなど)が記録されます。

2. 破損ブロックの修復

VALIDATE DATABASE によって破損ブロックが特定された場合、RECOVER CORRUPTION LIST コマンドを使用して修復を試みます。

RMAN> RECOVER CORRUPTION LIST;

このコマンドを実行すると、RMANはバックアップを使用して破損ブロックを復旧します。

3. 修復結果の確認

修復が完了した後、再度 V$DATABASE_BLOCK_CORRUPTION ビューを確認し、破損ブロックが修正されたかを確認します。

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;


行が選択されていません

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

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

4. 追加の修復手順(必要に応じて)

RECOVER CORRUPTION LIST で修復できない場合、以下の方法を試すことができます。

  • 個別にブロックを修復する RECOVER DATAFILE <file_id> BLOCK <block_id>; を使用して、特定のブロックのみを修復します。RMAN> RECOVER DATAFILE 4 BLOCK 100;
  • データファイル全体を復旧する 破損したブロックが多い場合は、データファイル全体を復旧する方が効率的です。RMAN> RESTORE DATAFILE 4; RMAN> RECOVER DATAFILE 4;

5. 予防策

データブロックの破損を防ぐために、以下の設定を検討してください。

  • DB_BLOCK_CHECKSUM を有効化 破損の早期検出のため、DB_BLOCK_CHECKSUMTYPICAL または FULL に設定する。ALTER SYSTEM SET DB_BLOCK_CHECKSUM=TYPICAL SCOPE=BOTH;
  • DB_BLOCK_CHECKING を有効化 破損の発生を防ぐため、DB_BLOCK_CHECKINGTYPICAL または FULL に設定する。ALTER SYSTEM SET DB_BLOCK_CHECKING=TYPICAL SCOPE=BOTH;
  • 定期的なRMANバックアップの実施 破損発生時に迅速な復旧を可能にするため、定期的にバックアップを取得しておく。RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

まとめ

本記事では、Oracleデータベースにおいて VALIDATE DATABASE コマンドで破損ブロックを特定し、RECOVER CORRUPTION LIST で修復する方法について解説しました。さらに、追加の修復手順や予防策についても紹介しました。データの健全性を維持するために、定期的なバックアップと適切なパラメータ設定を行いましょう。

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

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

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

コメント

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