Email: [email protected] 7 x 24 online support!
Oracle DBMS_REPAIR.CHECK_OBJECTが有効に動作しない
プロのOracle Databaseの復旧サービスを提供
携帯番号: +86 13764045638 メール:[email protected]
[起こりうる現象]
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の使用をご検討下さい。

沪公网安备 31010802001377号