首页 > Oracle > exp一张大表报ORA-01555和ORA-22922

exp一张大表报ORA-01555和ORA-22922

好早之前的一个活,一个pc server,windows下装的oracle9i,想换ibm p570小机,数据需从pc server迁移到小机,一张大表含blob类型字段,表数据量4T,当数据量导出到1.5TB时就会报ORA-01555和ORA-22922错。做了N多尝试,还是用了Oracle MOS的方案,原因还是在于有一些LOB数据库坏掉了,这里记录一下。

1 建一张临时表,用于存坏掉LOB相应行的rowid,例如:corrupt_lobs

SQL> create table corrupt_lobs (corrupt_rowid rowid, err_num number);

2 看一下表结构

DESC LOBDATA

Name Null? Type
———- ——— ————
ID NOT NULL NUMBER
DOCUMENT BLOB


3 运行如下PLSQL脚本

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, 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;
end;
end loop;
end;
/

所有坏掉了的LOB相应行的rowid都会被记录在这张表中。
4 在源表中处理掉坏掉的LOB数据

SQL> update LOBDATA set document = empty_blob()
where rowid in (select corrupt_rowid from corrupt_lobs);

所坏掉的LOB数据置空。
5、再执行导出就OK了。

分类: Oracle 标签: , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.