ORACLE LOB段损坏导致数据导出报错ORA-01555

ORA-01555这个错误,估计大部分人都遇到过,在有对象的业务系统,进行数据导出时,也时常遇到,一般都是通过调整UNDO的保留时间来处理,但调整后,也不行呢,下面正好遇到这个情况,请网下看 :

目录

问题现象

问题分析

问题解决


问题现象

        前两天突然停电,在来电17:44启动后,医生写病历,保存不起,病历保存,就报下面的错误,

问题分析

      接到这个问题后,根据以前的经验,一般想到突然停电重启后,都是数据库起不来,本次能起来,但部分业务无法继续下去,赶紧看看数据库日志:

      根据启动时间看,报警日志先报ORA-600[kdsgrp1]:

 

晚上22点后,就一直报:

既然有具体的块,那就查一下,经过查询,发现是一个大对象:

看来是电子病历格式这个表的 文本内容 字段某个内容存在问题。

经查MOS,上面主要是说basic file lob的BUG,需要升级,想到以前就好好的,如果BUG,以前也应该有问题,为什么现在就不行了呢,估计与什么坏掉有关系。

想到能否把数据导出来呢

结果发现,一直导不出来,每次都停在这个表

即使调整了大对象的 retention,或者 pctversion ,都不能解决问题。

Alter system set retention=10800;

Alter table 电子病历格式 modify lob (文本内容) (retention);

或者

Alter table 电子病历格式 modify lob (文本内容) ((pctversion xx);

设置后,问题依然存在

通过这番操作后,进一步确定了可能BLOB本身内容出现问题。

问题解决

      找到出问题的这个大对象,然后,置空处理。

具体办法如下:

  1. 创建中间表

create table corrupt_lobs (corrupt_rowid rowid, err_num number);

  1. 找出坏块行

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);

  n number;

begin

  for cursor_lob in (select rowid r,文本内容 from zlhis.电子病历格式) loop

  begin

    n:=dbms_lob.instr(cursor_lob.文本内容,hextoraw('889911'));

  exception

    when error_1578 then

      insert into corrupt_lobs values (cursor_lob.r, 1578);

      commit;

    when error_1555 then

      insert into corrupt_lobs values (cursor_lob.r, 1555);

      commit;

    when error_22922 then

      insert into corrupt_lobs values (cursor_lob.r, 22922);

      commit;

    when error_22924 then

      insert into corrupt_lobs values (cursor_lob.r, 22924);

      commit;

    end;

  end loop;

end;

/

还好,只有一行存在问题

既然找到这行,如果导出时,跳过这行是否可行呢

成功导出。

再次验证一下:

既然如此,直接把有问题的这个字段内容置空:

update zlhis.电子病历格式 set 文本内容 = empty_clob() where rowid in (select corrupt_rowid from corrupt_lobs);

注意,如果是 BLOB ,BFILE 字段就用 EMPTY_BLOB()

,如果是CLOB,NCLOB字段,就用 EMPTY_CLOB()

到此,再去写病历,问题消失,报警文件不再报错。以最小代价处理了该问题。

-------------------------------------------

为了方便交流,我建立了一个微信群:水煮数据库,主要交流日常运维中用到的数据库相关问题,包含但不限于:ORACLE,PG,MYSQL,SQLSERVER,OB,TIDB,达梦,TDSQL,OPENGAUSS,人大金仓,GBASE等等,如果有兴趣交流,可以加我微信:zq24803366, 我可以拉你入群。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/cqsztech/article/details/138769795

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值