ORA-01555 ORA-22924 快照过旧问题处理

ORA-01555 ORA-22924 快照过旧问题处理

问题描述

使用数据泵导出数据,或在业务功能查询某个表时,可能出现 ORA-01555 ORA-22924 快照过旧的错误:

ORA-01555: snapshot too old: rollback segment number with name "" too small
ORA-22924: snapshot too old

解决办法

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;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值