问题描述:

数据库通过exp/expdp全库导出时提示ORA-01555:snapshot too old:rollback segment number with name “” too small
在这里插入图片描述

原因分析:

遇到这种ORA-01555快照过旧的问题,通常可以先去检查undo表空间的大小和undo_retention参数的设置,并进行增大调整的方法进行处理; 在已经处理的案例中,只处理上面的两个参数问题依旧存在,一般这种问题是由于表中的blob字段有损坏导致的,可继续按照下面的思路进行处理。


解决方案:

第一步:查询这个表有几个lob字段:
select table_name,column_name,pctversion,retention from dba_lobs where table_name=’顺坏的表名称’;
在这里插入图片描述

第二步:分别查询两个字段是否存在损坏:
–创建临时表corrupt_lobs_wfcaserun用于存放检查结果
create table corrupt_lobs_wfcaserun (corrupt_rowid rowid);
–执行检查,并将检查出blob字段存在问题的数据的rowid放到临时表中(其中V3XUSER是数据库用户名,WF_CASE_RUN是需要检查的协同表明,CASEOBJECT是lob字段名,该表有多个lob字段需逐一检查)
declare
error_1578 exception;
error_1555 exception;
error_22922 exception;
pragma exception_init(error_1578, -1578);
pragma exception_init(error_1555, -1555);
pragma exception_init(error_22922, -22922);
num number;
begin
for cursor_lob in (select rowid r, CASEOBJECT from V3XUSER.WF_CASE_RUN) loop
begin
num := dbms_lob.instr(cursor_lob.CASEOBJECT, hextoraw(‘889911’));
exception
when error_1578 then
insert into corrupt_lobs_wfcaserun values (cursor_lob.r);
commit;
when error_1555 then
insert into corrupt_lobs_wfcaserun values (cursor_lob.r);
commit;
when error_22922 then
insert into corrupt_lobs_wfcaserun values (cursor_lob.r);
commit;
end;
end loop;
end;
在这里插入图片描述
第三步:删除问题数据:
delete from V3XUSER.WF_CASE_RUN where rowid in (select corrupt_rowid from corrupt_lobs_wfcaserun);
在这里插入图片描述
第四步:重新导出数据

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐