重庆思庄Oracle、、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1230|回复: 0

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

[复制链接]
发表于 2024-12-29 07:56:27 | 显示全部楼层 |阅读模式
背景情况:
16312677090203cbd6.png


处理过该问题的都知道,这是一个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>\'\)\"

422267708fefa58a5.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2025-4-20 12:34 , Processed in 0.113231 second(s), 24 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表