Oracle解决exp导出文件过大的问题

先由exp把数据卸出到文件系统, 产生一个.dmp文件, 然后必要时再由imp将数据装入数据库. 对于一般中小型数据库来说, 全数据库的exp所产生的dmp文件可能小于2GB, 但对稍大型的数据库, exp产生的数据动辄数十至上百个GB. 而现时多数操作系统为32位, 其文件系统允许的最大文件为2GB. 这样显然不能由文件系统存放exp产生的数据. 这是问题之一. 另一个问题是随着数据库的不断增大, exp所需时间越来越长以致实际上很难实施. 本文针对以上两个问题讨论相应对策.

管道

管道 是一种伪文件. 它存在于内存中, 用于快速I/O操作. 管道的缓冲区采用先进先出机制, 即写管道进程写到缓冲区头部而读管道进程读取管道尾部. 建立管道的命令为”mknod filename p".

gzip命令

名称

        gzip, gunzip, zcat -压缩或解压文件

总览

        gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ...  ]

        gunzip [ -acfhlLnNrtvV ] [-S suffix] [ name ...  ]

        zcat [ -fhLV ] [ name ...  ]

描述

Gzip使用lempel - ziv编码减少指定文件的大小(LZ77)。在可能的情况下,每个文件都被一个扩展名替换.gz,同时保持相同的所有权模式,访问和修改时间。(默认扩展名对于VMS为-gz,对于MSDOS,OS /2 FAT,Windows NT FAT和Atari为Z。) 如果没有指定文件,或者文件名是“-”,则标准输入被压缩到标准输出。Gzip只会尝试压缩常规文件。特别是,它将忽略符号链接。

如果压缩文件名对其文件系统太长,则gzip将其截断。Gzip试图只截断长度超过3个字符文件名称的部分。(部分是由点来分隔的。) 如果名称仅由小部分组成,最长的部分被截断。例如,如果文件名限制在14个字符,那么gzip.msdos.exe被压缩为gzi.msd.exe.gz。在没有限制文件名长度的系统上,名称不会被截断。

。。。。。。

选项

-f --force

强制压缩或解压,即使该文件有多个链接或相应的文件已经存在,或者将压缩的数据从终端读取或写入到终端。如果输入数据没有gzip识别的格式,并且如果选项--stdout也被给出,那么将输入数据复制到标准输出:让zcat表现为cat。

数据流重定向

标准输入(stdin):代码为0,使用<或<<;

标准输出(stdout):代码为1,使用>或>>;

标准错误输出(stderr):代码为2,使用2>或2>>

解决方案

1.建立命名管道

mknod mypipe p

 

2.结合exp和gzip将导出的dmp文件直接压缩

exp $SWITCH_DBUSER/$SWITCH_DBPASS file=$HOME/file/expdp/mypipe tables=card_bin &

gzip <$HOME/file/expdp/mypipe >$HOME/file/expdp/card_bin.gz

 

如此即解决了直接导出dmp文件过大的弊端

如何通过备份的数据进行恢复呢

3.解压缩gz文件

gunzip -c card_bin.gz > card_bin.dmp

4.imp导入dmp文件

imp $SWITCH_DBUSER/$SWITCH_DBPASS IGNORE=y file=card_bin.dmp full=y

参考资料

《man gzip》

《鸟哥的Linux私房菜——基础学习篇》

https://yq.aliyun.com/ziliao/115289

http://blog.csdn.net/cnmilan/article/details/40592305

原文地址:https://www.cnblogs.com/yanxin880526/p/8031966.html