Oracle

Oracle 中的 LOB 索引損壞

  • August 15, 2016

為什麼無法重建損壞的 LOB 索引?那麼如果我的 LOB 索引損壞了,如何恢復呢?

警報日誌應該告訴您數據塊是否損壞,無需驗證索引結構。這將鎖定你的桌子直到完成。如果沒有備份,您可以嘗試使用 expdp 導出數據。然後刪除表並重新創建它並使用 impdp 導入。您還需要創建索引、約束和授權。也可以使用 CTAS。

在 LOB 列中,數據和索引是交織在一起的。該索引不能像普通索引一樣操作。使用此腳本來辨識損壞的行:

set serverout on
exec dbms_output.enable(100000);
declare
 page    number;
 len    number;
 c      varchar2(10);
 charpp number := 8132/2;

begin
 for r in (select rowid rid, dbms_lob.getlength (<your_clob_column>) len
           from   <your_table_with_clcob_column>) loop
   if r.len is not null then
     for page in 0..r.len/charpp loop
       begin
         select dbms_lob.substr (<your_clob_column>, 1, 1+ (page * charpp))
         into   c
         from   <your_table_with_clcob_column> 
         where  rowid = r.rid;

       exception
         when others then
           dbms_output.put_line ('Error on rowid ' ||R.rid||' page '||page);
           dbms_output.put_line (sqlerrm);
       end;
     end loop;
   end if;
 end loop;
end;
/

您需要刪除行或將 LOB 列更新為空 LOB:

update <your_lob_table> 
set <your_lob_column> = empty_blob() 
where rowid=<your_corrupt_rowid>;

引用自:https://dba.stackexchange.com/questions/107970