Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2232392
  • 博文数量: 310
  • 博客积分: 6853
  • 博客等级: 准将
  • 技术积分: 2833
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-04 16:41
文章分类

全部博文(310)

文章存档

2013年(17)

2012年(42)

2011年(76)

2010年(71)

2009年(99)

2007年(2)

2006年(1)

2005年(2)

分类: Oracle

2010-09-26 13:30:04

报ora-01555,可能有三种原因造成的

1、回滚段太小导致

若报 ora-22924,则限定在与lob字段有关

2、lob字段的pctfree太小导致

3、lob字段中存储的内容corrupt,导致获取内容是报该错误。


定位方法:

1、关闭其他用户连接,仅作exp操作。
a、如果仍报该错,则说明是第3种原因导致。
b、不报错,原因可能是1or2

2、调整了回滚段大小以及保留时间。
a、若报错,则说明是第2种原因导致。
b、不报错,则原因为第1种。


快速解决的办法:

1、关闭其他用户连接,仅作exp操作,能解决1、2两种错误。这是对于exp操作。
2、对于正常的业务操作,导致该错误,需要根据错误原因调整回滚段的大小以及保留时间,或者pctfree。
3、对于因lob中的错误内容导致的错,需要清空该字段内容进行解决。


快速定位问题lob的方法:

create table corrupt_lobs (corrupt_rowid rowid);


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); 
n number; 
begin 
for cursor_lob in (select rowid r, document from LOBDATA ) loop 
begin n:=dbms_lob.instr(cursor_lob.document,hextoraw('889911')); 
exception when error_1578 then 
insert into corrupt_lobs values (cursor_lob.r); commit; 
when error_1555 then insert into corrupt_lobs values (cursor_lob.r); commit; 
when error_22922 then insert into corrupt_lobs values (cursor_lob.r); commit; 
end; 
end loop; 
end; 

select * from corrupt_lobs;

update PRINT_TEMPLATE set TEMPLATE_VAL = empty_blob() where rowid in (select corrupt_rowid from corrupt_lobs);
阅读(10254) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~