7 x 24 在线支持!
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の使用をご検討下さい。