ITPub博客

首页 > 数据库 > Oracle > ORA-02354 ORA-01555 ORA-22924

ORA-02354 ORA-01555 ORA-22924

原创 Oracle 作者:hellohf123 时间:2023-10-23 09:50:49 0 删除 编辑

问题描述

使用数据泵导出数据,或在业务功能查询某个表时,可能出现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博客 ” ,链接:https://blog.itpub.net/70004783/viewspace-2990334/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2021-08-05

  • 博文量
    78
  • 访问量
    81364