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了。
近期评论