Email: service@parnassusdata.com 7 x 24 online support!

Oracle DBMS_REPAIR.CHECK_OBJECTが有効に動作しない

Oracle DBMS_REPAIR.CHECK_OBJECTが有効に動作しない

 

プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:service@parnassusdata.com

 

 

[起こりうる現象]
DBMS_REPAIR.CHECK_OBJECTが有効に動作しません。
仕様としては、破損ブロックに対してSoft Corruptのマークがついているといない
とに関わらず、DBMS_REPAIR.CHECK_OBJECTは破損ブロックを検出し、当該ブロック
に関する情報をREPAIR_TABLEに格納します。
しかし、この問題では破損ブロックに関する情報が、REPAIR_TABLEに格納される
事はありません。


[対象リリース]
問題が発生するリリース  :Oracle 8i Database 8.1.5.0 - 8.1.7.0 
問題を修正したリリース  : Oracle 9i Database 9.0.1.0
問題を修正したPSR       :PSR 8.1.7.1


[対象プラットフォーム]
すべてのプラットフォーム


[起こりうる条件]
Soft Corruptとマークされているか否かに関わらず、破損ブロックが含まれる
オブジェクトに対してDBMS_REPAIR.CHECK_OBJECTが行われた場合に発生します。


[原因]
1. 破損ブロックにSoft Corruptのマークがついている場合

  DBMS_REPAIR.CHECK_OBJECTは、Soft Corruptのマークがついているブロックを
  読み込んでも破損ブロックとしてレポートしません。そのため、破損ブロック
  が含まれていたかどうかが判断できません。

  以下が、Soft Corruptのマークがついているブロックを含むテーブルを検証
  した結果です。


SQL> declare num_corrupt INT;
  2         begin
  3           num_corrupt := 0;
  4           dbms_repair.check_object (
  5             schema_name => 'SCOTT',
  6             object_name => 'EMP',
  7             repair_table_name => 'REPAIR_TABLE',
  8             corrupt_count => num_corrupt);
  9           dbms_output.put_line('num :'|| to_char(num_corrupt));
 10  end;
 11  /
num :0   <============= 破損ブロックが存在するにも関わらず 0 となる

PL/SQL procedure successfully completed.

  また、REPAIR_TABLEにも情報は格納されません。

SQL> select object_name, block_id, REPAIR_DESCRIPTION
  2  from repair_table;

レコードが選択されませんでした。



2. 破損ブロックにSoft Corruptのマークがついていない場合

   DBMS_REPAIR.CHECK_OBJECTがSoft Corruptのマークがついていないブロックを
  読み込むと、ORA-1578が発生します。仕様としては、破損状況をREPAIR_TABLE
  に格納するというものですが、ORA-1578が発生してREPAIR_TABLEに情報は格納
  されません。

  以下が、Soft Corruptのマークがついていないブロックを含むテーブルを検証
  した結果です。


SQL> declare num_corrupt INT;
  2         begin
  3           num_corrupt := 0;
  4           dbms_repair.check_object (
  5             schema_name => 'SCOTT',
  6             object_name => 'EMP',
  7             repair_table_name => 'REPAIR_TABLE',
  8             corrupt_count => num_corrupt);
  9           dbms_output.put_line('num :'|| to_char(num_corrupt));
 10  end;
 11  /
declare num_corrupt INT;
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 7, block # 2)
ORA-01110: data file 7: '/home/oracle/app/oradata/db816/users01.dbf'
ORA-06512: at "SYS.DBMS_REPAIR", line 284
ORA-06512: at line 4

  この場合にも、REPAIR_TABLEには情報は格納されません。

SQL> select object_name, block_id, repair_description
  2  from repair_table;

レコードが選択されませんでした。


[回避策]
破損ブロックを検出するためには、該当するバージョンではDBMS_REPAIRは使用
できません。[参照情報]のKROWN等を参照の上、DBVERIFYの使用をご検討下さい。