在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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
导出是能并行了,但是导入的时候不能并行啊,IMPDP APPEND模式,直接就enq:TM-contention了
4年前

1
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
563次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
488次阅读
2025-04-18 14:18:38
Oracle SQL 执行计划分析与优化指南
Digital Observer
462次阅读
2025-04-01 11:08:44
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
455次阅读
2025-04-08 09:12:48
墨天轮个人数说知识点合集
JiekeXu
454次阅读
2025-04-01 15:56:03
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
442次阅读
2025-04-22 00:20:37
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
429次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
417次阅读
2025-04-22 00:13:51
Oracle 19c RAC更换IP实战,运维必看!
szrsu
401次阅读
2025-04-08 23:57:08
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
374次阅读
2025-04-17 17:02:24