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_CHECKSUMをTYPICALまたはFULLに設定する。ALTER SYSTEM SET DB_BLOCK_CHECKSUM=TYPICAL SCOPE=BOTH;DB_BLOCK_CHECKINGを有効化 破損の発生を防ぐため、DB_BLOCK_CHECKINGをTYPICALまたは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専門のエージェントで非公開求人をチェックしてみませんか?




コメント