在用exp导出时,如果表很大,比如几个G,甚至几十个G,而本地磁盘又没有足够的空间存储dmp文件.
那我们可以用pipe+gzip(or compress) 方式进行导出, 在导入时用pipe+ gunzip(or uncompresss)进行.
示例如下:
—————导出过程———————–
SQL> select count(*) from FORUM_PRIVMSGS_TEXT;
COUNT(*)
———-
11339706
SQL> select bytes/(1024*1024) from user_segments where segment_name=’FORUM_PRIVMSGS_TEXT’;
BYTES/(1024*1024)
—————–
5859
这个表占用空间近 6GB, 如果直接导出,担心本地磁盘没有足够的空间存储.
–创建pipe
$mknod /disk1/p1 p
$mknod /disk1/p2 p
$mknod /disk1/p3 p
$mknod /disk1/p4 p
$mknod /disk1/p5 p
$mknod /disk1/p6 p
如果是用root创建的,则要让oracle可写.
–后台执行压缩
$gzip -c </disk1/p1 >/disk1/1.dmp.gz &
$gzip -c </disk1/p2 >/disk1/2.dmp.gz &
$gzip -c </disk1/p3 >/disk1/3.dmp.gz &
$gzip -c </disk1/p4 >/disk1/4.dmp.gz &
$gzip -c </disk1/p5 >/disk1/5.dmp.gz &
$gzip -c </disk1/p6 >/disk1/6.dmp.gz &
–compress.par(导出参数文件)
userid=username/passwd
tables=(FORUM_PRIVMSGS_TEXT)
log=/disk1/FORUM_PRIVMSGS_TEXT.log
file=(
/disk1/p1,
/disk1/p2,
/disk1/p3,
/disk1/p4,
/disk1/p5,
/disk1/p6)
rows=y
indexes=n
compress=n
constraints=n
grants=n
filesize=1024M
feedback=5000
–运行导出
$nohup exp parfile=compress.par > FORUM_PRIVMSGS_TEXT.out 2>&1 &
–监控导出过程
$tail -f FORUM_PRIVMSGS_TEXT.out (or FORUM_PRIVMSGS_TEXT.log)
———————–导入过程————————–
–不同的地方:
gunzip -c >/disk1/p1</disk1/1.dmp.gz &
gunzip -c >/disk1/p2</disk1/2.dmp.gz &
…
…
等exp/imp过程结束后,后台运行的gzip/gunzip过程会自动结束.
创建的pipe直接 rm即可.
几点说明:
1, 为了加快导出速度,如果没有lob,可以指定direct=y
2, 可以设置buffer=一个比较大的值,不过如果有LONG, LOB, BFILE, REF, ROWID, LOGICAL ROWID, or
DATE 等数据类型,则每次导出一行; 并且buffer与direct不兼容,只能用于conventional path export.
3, compress=n,是为了避免在import时在ts中找不到一个足够大的extent. 如果表空间创建时是uniform size,是不会造成fragement,所以不必指定compress=y(default).
4, aix中压缩时建议使用 compress -c,因为没有gzip工具
5, 在imp到另一个用户时,如果事先未创建表,你需要指定目标用户的缺省表空间,取消在其它表空间上的quota
未经允许不得转载:SRE空间 » 导出大表到pipe并压缩
评论前必须登录!
注册