コンテンツにスキップ

ブロックメディアリカバリ

ブロックメディアリカバリは、破損したDBのブロックの修復を行ってくれる機能。
実行するためにDBの停止などは不要。

必要なのは以下。

  • ArchiveLogモードでの運用
  • EnterpriseEdition
  • バックアップ or フラッシュバックログ or DataGridのフィジカルスタンバイDB (ここから正しいデータを持ってくる)

事前準備

sqlplus / as sysdba

-- アーカイブログモードに変更

-- 表領域をできるだけ小さく(大きいと該当箇所探すのが大変)
ALTER DATABASE DATAFILE '/u01/app/oracle/usertbs.dbf' RESIZE 10M;

サンプルデータ投入

sqlplus dbuser/dbuser

-- usersテーブルの作成 & 各列の定義作成
CREATE TABLE users (
    ID       NUMBER PRIMARY KEY,
    name     VARCHAR2(50),
    email    VARCHAR2(100),
    birthday DATE
);

-- usersテーブルにデータを挿入
INSERT INTO users (ID, name, email, birthday) VALUES (1,  'Alice',   'alice@example.com',   TO_DATE('1990-01-01', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (2,  'Bob',     'bob@example.com',     TO_DATE('1985-02-15', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (3,  'Charlie', 'charlie@example.com', TO_DATE('1980-03-20', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (4,  'David',   'david@example.com',   TO_DATE('1992-04-10', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (5,  'Eva',     'eva@example.com',     TO_DATE('1993-05-05', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (6,  'Frank',   'frank@example.com',   TO_DATE('1988-06-15', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (7,  'Grace',   'grace@example.com',   TO_DATE('1995-07-20', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (8,  'Hannah',  'hannah@example.com',  TO_DATE('1983-08-25', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (9,  'Ivy',     'ivy@example.com',     TO_DATE('1991-09-10', 'YYYY-MM-DD'));
INSERT INTO users (ID, name, email, birthday) VALUES (10, 'Jack',    'jack@example.com',    TO_DATE('1987-10-30', 'YYYY-MM-DD'));
COMMIT;

-- usersテーブルを表示
set line 200
SELECT * FROM users;

バックアップ作製

rman target /

BACKUP DATABASE PLUS ARCHIVELOG;

ブロックを破壊

バイナリ編集し、わざと破損させる。
データがある箇所の確認

hexdump -Cv /u01/app/oracle/usertbs.dbf | grep -v '00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00'

頑張ってそれっぽいところを探す

hexdump -Cv /u01/app/oracle/usertbs.dbf | grep -E '^0010de'

0010de00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de20  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de30  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de40  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de50  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de60  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de70  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de80  00 00 00 00 00 00 00 00  2c 01 04 02 c1 0b 04 4a  |........,......J|
0010de90  61 63 6b 10 6a 61 63 6b  40 65 78 61 6d 70 6c 65  |ack.jack@example| ★ ここを壊す
0010dea0  2e 63 6f 6d 07 77 bb 0a  1e 01 01 01 2c 01 04 02  |.com.w......,...|
0010deb0  c1 0a 03 49 76 79 0f 69  76 79 40 65 78 61 6d 70  |...Ivy.ivy@examp|
0010dec0  6c 65 2e 63 6f 6d 07 77  bf 09 0a 01 01 01 2c 01  |le.com.w......,.|
0010ded0  04 02 c1 09 06 48 61 6e  6e 61 68 12 68 61 6e 6e  |.....Hannah.hann|
0010dee0  61 68 40 65 78 61 6d 70  6c 65 2e 63 6f 6d 07 77  |ah@example.com.w|
0010def0  b7 08 19 01 01 01 2c 01  04 02 c1 08 05 47 72 61  |......,......Gra|

10de90 = 1105552 個目のブロックに'\x00'を書き込む

echo -en '\x00' | dd of=/u01/app/oracle/usertbs.dbf bs=1 seek=1105552 conv=notrunc

hexdump -Cv /u01/app/oracle/usertbs.dbf | grep -E '^0010de'

0010de00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de20  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de30  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de40  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de50  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de60  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de70  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de80  00 00 00 00 00 00 00 00  2c 01 04 02 c1 0b 04 4a  |........,......J|
0010de90  00 63 6b 10 6a 61 63 6b  40 65 78 61 6d 70 6c 65  |.ck.jack@example| ★
0010dea0  2e 63 6f 6d 07 77 bb 0a  1e 01 01 01 2c 01 04 02  |.com.w......,...|
0010deb0  c1 0a 03 49 76 79 0f 69  76 79 40 65 78 61 6d 70  |...Ivy.ivy@examp|
0010dec0  6c 65 2e 63 6f 6d 07 77  bf 09 0a 01 01 01 2c 01  |le.com.w......,.|
0010ded0  04 02 c1 09 06 48 61 6e  6e 61 68 12 68 61 6e 6e  |.....Hannah.hann|
0010dee0  61 68 40 65 78 61 6d 70  6c 65 2e 63 6f 6d 07 77  |ah@example.com.w|
0010def0  b7 08 19 01 01 01 2c 01  04 02 c1 08 05 47 72 61  |......,......Gra|
[oracle@oracle19c ~]$ 

確認・修復

export NLS_LANG=Japanese_Japan.AL32UTF8
rman target /

データファイルの破損チェックを実行

RMAN> validate database;

validateを23-08-20で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=278 デバイス・タイプ=DISK
チャネルORA_DISK_1: データファイルの検証を開始しています
チャネルORA_DISK_1: 検証のためのデータファイルを指定しています
入力データファイル ファイル番号=00001 名前=/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_l7kvnjcv_.dbf
入力データファイル ファイル番号=00003 名前=/u01/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_l7kvo9j2_.dbf
入力データファイル ファイル番号=00004 名前=/u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_l7kvormc_.dbf
入力データファイル ファイル番号=00005 名前=/u01/app/oracle/usertbs.dbf
入力データファイル ファイル番号=00007 名前=/u01/app/oracle/oradata/ORCL/datafile/o1_mf_users_l7kvospt_.dbf
チャネルORA_DISK_1: 検証が完了しました。経過時間: 00:00:01
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
1    OK     0              18075        117770          2334998   
  ファイル名: /u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_l7kvnjcv_.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              81424           
  Index      0              13171           
  Other      0              5090            

    :

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
5    FAILED 0              1141         1280            2334337   ★ StatusがFAILEDとなっている
  ファイル名: /u01/app/oracle/usertbs.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       1              5               ★ Blocks Failingが 1となっている
  Index      0              1               
  Other      0              133             

    ::

検証により1つ以上の破損したブロックが見つかりました
詳細はトレース・ファイル/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2046.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を23-08-20で終了しました

検出された破損ブロックを確認

RMAN> select FILE#, BLOCK#, BLOCKS, CORRUPTION_TYPE from v$database_block_corruption;

     FILE#     BLOCK#     BLOCKS CORRUPTIO
---------- ---------- ---------- ---------
         5        134          1 CHECKSUM 

破損ブロックを修復

RMAN> recover corruption list;

recoverを23-08-20で開始しています
チャネルORA_DISK_1の使用

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

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

recoverを23-08-20で終了しました

破損ブロックがないことを確認

RMAN> select FILE#, BLOCK#, BLOCKS, CORRUPTION_TYPE from v$database_block_corruption;

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています

行が選択されていません

バイナリでも復旧したことが確認できる。

hexdump -Cv /u01/app/oracle/usertbs.dbf | grep -E '^0010de'

0010de00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de20  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de30  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de40  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de50  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de60  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de70  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de80  00 00 00 00 00 00 00 00  2c 01 04 02 c1 0b 04 4a  |........,......J|
0010de90  61 63 6b 10 6a 61 63 6b  40 65 78 61 6d 70 6c 65  |ack.jack@example| ★
0010dea0  2e 63 6f 6d 07 77 bb 0a  1e 01 01 01 2c 01 04 02  |.com.w......,...|
0010deb0  c1 0a 03 49 76 79 0f 69  76 79 40 65 78 61 6d 70  |...Ivy.ivy@examp|
0010dec0  6c 65 2e 63 6f 6d 07 77  bf 09 0a 01 01 01 2c 01  |le.com.w......,.|
0010ded0  04 02 c1 09 06 48 61 6e  6e 61 68 12 68 61 6e 6e  |.....Hannah.hann|
0010dee0  61 68 40 65 78 61 6d 70  6c 65 2e 63 6f 6d 07 77  |ah@example.com.w|
0010def0  b7 08 19 01 01 01 2c 01  04 02 c1 08 05 47 72 61  |......,......Gra|

別解: データリカバリアドバイザーによる復旧

修復をよしなにしてくれる。

  • 検出済みのファイル消失、ブロック破損の表示
  • 破損修復スクリプトの生成
  • 修復の実行

データファイルの破損チェックを実行(ここまで手動と同じ) ⇒ 障害が検出される

RMAN> validate database;

    :

File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
5    FAILED 0              1141         1280            2334337   ★ StatusがFAILEDとなっている
  ファイル名: /u01/app/oracle/usertbs.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       1              5               ★ Blocks Failingが 1となっている
  Index      0              1               
  Other      0              133             

    :
検証により1つ以上の破損したブロックが見つかりました
    :

検出されている障害を表示

RMAN> list failure;

データベース・ロール: PRIMARY

List of Database Failures
=========================

障害ID 優先度ステータス    検出時間 サマリー
------ -------- --------- -------- -------
81     HIGH     OPEN      23-08-20 データファイル5: '/u01/app/oracle/usertbs.dbf'には破損したブロックが1つ以上含まれています

障害分析

RMAN> advise failure;

データベース・ロール: PRIMARY

List of Database Failures
=========================

障害ID 優先度ステータス    検出時間 サマリー
------ -------- --------- -------- -------
81     HIGH     OPEN      23-08-20 データファイル5: '/u01/app/oracle/usertbs.dbf'には破損したブロックが1つ以上含まれています

自動修復オプションを分析中です。これには少し時間がかかる場合があります
チャネルORA_DISK_1の使用
自動修復オプションの分析が完了しました

必須の手動アクション
========================
no manual actions available

Optional Manual Actions
=======================
no manual actions available

自動修復オプション
========================
オプション 修復 説明
------ ------------------
1      ブロック134 (ファイル5)のブロック・メディア・リカバリを実行します  
  計画: 修復には、データが損失しない完全なメディア・リカバリが含まれます
  Repair script: /u01/app/oracle/diag/rdbms/orcl/orcl/hm/reco_683051497.hm

推奨された復旧手順の確認

RMAN> repair failure preview;

計画: 修復には、データが損失しない完全なメディア・リカバリが含まれます
Repair script: /u01/app/oracle/diag/rdbms/orcl/orcl/hm/reco_683051497.hm

修復スクリプトの内容:
   # block media recovery
   recover datafile 5 block 134;

首位称された復旧手順の実行

RMAN> repair failure;

計画: 修復には、データが損失しない完全なメディア・リカバリが含まれます
Repair script: /u01/app/oracle/diag/rdbms/orcl/orcl/hm/reco_683051497.hm

修復スクリプトの内容:
   # block media recovery
   recover datafile 5 block 134;

この修復を実行しますか(YESまたはNOを入力してください)。 yes ★ yesを回答
修復スクリプトを実行しています

recoverを23-08-20で開始しています
チャネルORA_DISK_1の使用

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

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

recoverを23-08-20で終了しました
障害の修復が完了しました

障害が修復されたか確認

RMAN> list failure;

データベース・ロール: PRIMARY

指定に一致する障害が見つかりません

バイナリでも復旧したことが確認できる。

hexdump -Cv /u01/app/oracle/usertbs.dbf | grep -E '^0010de'

0010de00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de20  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de30  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de40  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de50  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de60  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de70  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0010de80  00 00 00 00 00 00 00 00  2c 01 04 02 c1 0b 04 4a  |........,......J|
0010de90  61 63 6b 10 6a 61 63 6b  40 65 78 61 6d 70 6c 65  |ack.jack@example| ★
0010dea0  2e 63 6f 6d 07 77 bb 0a  1e 01 01 01 2c 01 04 02  |.com.w......,...|
0010deb0  c1 0a 03 49 76 79 0f 69  76 79 40 65 78 61 6d 70  |...Ivy.ivy@examp|
0010dec0  6c 65 2e 63 6f 6d 07 77  bf 09 0a 01 01 01 2c 01  |le.com.w......,.|
0010ded0  04 02 c1 09 06 48 61 6e  6e 61 68 12 68 61 6e 6e  |.....Hannah.hann|
0010dee0  61 68 40 65 78 61 6d 70  6c 65 2e 63 6f 6d 07 77  |ah@example.com.w|
0010def0  b7 08 19 01 01 01 2c 01  04 02 c1 08 05 47 72 61  |......,......Gra|