暂无图片
暂无图片
1
暂无图片
暂无图片
2
暂无图片

Oracle FAQ:通过 rowid 或 主键分片并行导出含 LOB 或 CLOB 的大表

原创 eygle 2020-06-08
2855

在Oracle数据库中,在导出含LOB字段的大表时(尤其是当 表未分区,并且表大小已过TB),在导出过程中经常遇到因undo表空间大小和undo_retention设置保留时间,导致ORA-01555: snapshot too old的报错。那该怎么避免呢?

通过rowid或者主键的方式分批导出(推荐使用rowid),可以巧妙的解决类似的问题:

--创建一个表用于记录要导出表的rowid,并分批,这里分成50
create table scott.exp_rowid as select mod(rownum,50) sou_seq,rowid sou_rowid from scott.lobtest;
复制

示范参数文件:

--根据分批次数生成对应的parfile文件
cat >expdp_lobtest_seq0.par <<EOF
userid='/ as sysdba'
directory=datadump
dumpfile=expdp_lobtest_%U.dmp
logfile=expdp_lobtest.log
cluster=no
tables=scott.lobtest
query="where rowid in (select sou_rowid from scott.exp_rowid where sou_seq=0)"
EOF
复制

执行:

--执行导出
nohup expdp expdp_lobtest_20181219_seq0.par > expdp_lobtest_seq0.par.out &
…..
nohup expdp expdp_lobtest_20181219_seq50.par > expdp_lobtest__seq50.par.out &
复制

分成50个批次导出,可通过循环生成导出脚本
或者通过如下脚本:

chunk=10
for ((i=0;i<=9;i++));
do
expdp /as sysdba TABLES=LOBTEST QUERY=LOBTEST:\"where mod\(dbms_rowid.rowid_block_number\(rowid\)\, ${chunk}\) = ${i}\" directory=DMP dumpfile=lobtest_${i}.dmp logfile= lobtest_${i}.log &
echo $i
done
复制

类似的方法,在实践中是非常有效的。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

者行孙
暂无图片
4年前
评论
暂无图片 0
导出是能并行了,但是导入的时候不能并行啊,IMPDP APPEND模式,直接就enq:TM-contention了
4年前
暂无图片 点赞
1
www
暂无图片
1年前
回复
暂无图片 0
11g的版本的,有clob字段导入不能并行啊
1年前
暂无图片 点赞
回复