ITPub博客

首页 > 数据库 > Oracle > oracle数据泵跳过损坏的lob方法

oracle数据泵跳过损坏的lob方法

原创 Oracle 作者:wx13062302674 时间:2024-12-23 14:29:42 0 删除 编辑

oracle数据泵跳过损坏的lob方法

1、背景


巡检一台用户的服务器时,发现自动备份存在报错情况:

2、分析思路和处理过程


处理过该问题的都知道,这是一个lob段损坏的问题;

解决办法1:找到损坏的内容,清空,重新执行expdp。
解决办法2:找到损坏的内容,记录下来,然后数据泵跳过对应的行记录。

##这里我选择解决办法2:
SQL> create table result (id number, checked_rowid rowid, status varchar2(10), page number, error varchar2(100));

SQL>  set serverout on
exec dbms_output.enable(100000);
declare
page number;
len number;
c varchar2(10);
charpp number := 8132/2;
n number;
v_sqlerrm varchar2(100);
begin
n := 0;
for r  in (select rowid rid, dbms_lob.getlength (xmltype.getclobval(content)) len  -- replace column name
from zldoc.bz_doc_log) loop << replace table name
n := n+1;
if r.len is not null  then
for page  in 0..r.len/charpp loop
begin
select dbms_lob.substr (xmltype.getclobval(content), 1, 1+ (page * charpp)) --replace column name
into c
from zldoc.bz_doc_log      -- replace table name
where rowid = r.rid;
v_sqlerrm := SQLERRM;
insert into result values (n, r.rid,  'good', page, v_sqlerrm);
commit;
exception
when others  then
dbms_output.put_line ( 'Error on rowid ' ||r.rid|| ' page '||page);
dbms_output.put_line (sqlerrm);
v_sqlerrm := SQLERRM;
insert into result values (n, r.rid,  'bad',page,v_sqlerrm);
commit;
end;
end loop;
end  if;
end loop;
end;
/

expdp system/manager DIRECTORY=my_dir DUMPFILE=expdp.dmp LOGFILE=expdp.log TABLES=<USER>.TESTTAB QUERY=\"WHERE rowid NOT IN \(\ '<orrupt_rowid>\'\)\"

3、总结


问题的出现一般都是有几种办法,至于如何选择还是要根据自己的情况。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27147296/viewspace-3058672/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
拥有oracle ocp,mysql ocp,pg ace,精通oracle底层恢复,精通pg,如文件勒索、触发器勒索恢复,asm磁盘组各种故障处理,在各行业中帮助用户恢复了大量的数据。公众号:数据库技术加油站,欢迎关注!

注册时间:2018-08-30

  • 博文量
    44
  • 访问量
    58106