ORA-02354 ORA-01555 ORA-22924

hellohf123發表於2023-10-23

問題描述

使用資料泵匯出資料,或在業務功能查詢某個表時,可能出現ORA-02354 ORA-01555 ORA-2292 快照過舊的錯誤:

解決辦法:

1、建立表存放查詢出有問題的rowid

create table corrupted_lob_data (corrupted_rowid rowid, err_num number);

 2、 收集有問題欄位中存在問題值的rowid

在plsql工具裡執行以下sql,並替換以下3個變數:

lob_column 表的欄位名(一般掃描blob、clob欄位)

table_owner 表的所有者

table_with_lob 表名

declare  
  error_1578 exception;
  error_1555 exception;
  error_22922 exception;
  error_22924 exception;
  pragma exception_init(error_1578,-1578);
  pragma exception_init(error_1555,-1555);
  pragma exception_init(error_22922,-22922);
  pragma exception_init(error_22924,-22924);
  num number;  
begin  
  for cursor_lob in (select rowid r, &lob_column from &table_owner.&table_with_lob) loop  
    begin  
      num := dbms_lob.instr (cursor_lob.&lob_column, hextoraw ('889911')) ;  
    exception  
      when error_1578 then  
        insert into corrupted_lob_data values (cursor_lob.r,1578);  
        commit;  
      when error_1555 then  
        insert into corrupted_lob_data values (cursor_lob.r,1555);  
        commit;
      when error_22922 then  
        insert into corrupted_lob_data values (cursor_lob.r,22922);  
        commit;
      when error_22924 then  
        insert into corrupted_lob_data values (cursor_lob.r,22924);  
        commit;
    end;  
  end loop;  
end;  
/

3、檢視是否有資料損壞:

select * from corrupted_lob_data;

4、 透過查詢出的rowid檢視存在問題的記錄:

select * from 有LOB段損壞的表名 where rowid in (select corrupted_rowid from corrupted_lob_data);

5、 對問題資料進行刪除或置空(和業務確認)

--如果更新的表的欄位型別為CLOB,則用以下指令碼修復:
update 表名 set LOB欄位名=empty_clob() where rowid in (select corrupted_rowid from corrupted_lob_data);
--如果更新的表的欄位型別為BLOB,則用以下指令碼修復:
update 表名 set LOB欄位名=empty_blob() where rowid in (select corrupted_rowid from corrupted_lob_data);
commit;

6、再次在sqlplus中查詢或者匯出已經不會報錯

備註:此處如果不能對問題資料進行刪除或者置空,匯出資料可以排除掉有問題的rowid

expdp  \" /  as sysdba \" directory=DATA_PUMP_DIR dumpfile=table_sys_xform_template_history.dump logfile=table_sys_xform_template_history_dump.log tables=xxxxxxx.SYS_XFORM_TEMPLATE_HISTORY  CONTENT=DATA_ONLY  QUERY=\"WHERE rowid NOT IN \(\'AAAtdvAAFAAOR1ZAAE\'\) \"





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004783/viewspace-2990334/,如需轉載,請註明出處,否則將追究法律責任。