Oracle
Oracle 中的 LOB 索引損壞
為什麼無法重建損壞的 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>;