Oracle 管道 解决Exp/Imp大量数据处理问题

 更新时间:2009年07月09日 13:48:06   作者:  
Oracle的exp/imp是许多用户经常使用的两个工具. 它们常被用来做数据库的逻辑备份,数据库重组和数据转移等工作.

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

我们以UNIX为例首先看看怎么样超越2GB限制. 这需利用UNIX的通用技术, 如管道(named pipe), 数据拷贝工具dd以及数据压缩(compress). 下面分别讨论这几种技术.

·管道 是一种伪文件. 它存在于内存中, 用于快速I/O操作. 管道的缓冲区采用先进先出机制, 即写管道进程写到缓冲区头部而读管道进程读取管道尾部. 建立管道的命令为”mknod filename p".
·dd 允许我们从一个设备拷贝数据到另一个设备.
·compress 为UNIX数据压缩工具.
实施exp之前, 我们可先检查所产生dmp文件的大小. 以下步骤既可实现,
1. 生成管道:
$ mknod /tmp/mypipe p
2. exp结果输出到该管道
$ exp file=/tmp/mypipe <...其它exp选项> &
3. 读取管道并把结果输出到管道, 只为查看数据量:
$ dd if=/tmp/mypipe of=/dev/null
结果返回exp (.dmp)文件大小, 单位为块(512 bytes).
现在我们可以着手讨论具体方法,
1. 文件压缩
2. 直接exp到磁带
3. 综合方法
首先看文件压缩方法. 利用文件压缩我们可尽量避免dmp文件大小超过2GB限制. 我们利用UNIX的管道技术, 具体步骤如下,
1. 启动compress进程, 使之从管道读取数据并输出到磁盘文件.
$ mknod /tmp/exp_pipe p
$ compress < /tmp/exp_pipe > export.dmp.Z &
2. exp到管道.
$ exp file=/tmp/exp_pipe ... &
imp时情况类似.
再看看直接exp到磁带上的方法.
$ exp file=/dev/rmt/0m volsize=4G
$ imp file=/dev/rmt/0m volsize=4G
最后看看exp到裸设备上的方法,
$ exp file=/dev/rdsk/c0t3d0s0 volsize=4G
imp类似.以上方法都可使我们避免2GB限制.
下面讨论怎么样缩短exp索需时间的问题. 目前多数用户会采用exp到磁带的方法只因没有足够的剩余硬盘空间. 而整个exp过程所花时间的大部分都在写磁带上. 通过我们上面对UNIX工具的讨论, 我们可以做到先exp到管道, 再将管道数据压缩后输出到磁带上. 这样写磁带的数据量可大大减少, 从而在相当程度上缩短写磁带时间. 另外从Oracle内部角度讲, 从7.3版开始, Oracle允许用户做direct path export, 即跳过Oracle
$ make -f $ORACLE_HOME/rdbms/lib/oracle.mk expst
$ make -f $ORACLE_HOME/rdbms/lib/oracle.mk impst
以上步骤产生的可执行文件expst (exp single task)和impst与exp/imp用法完全相同. 使用它们比使用exp/imp可节省多至30%的时间. 但在使用它们时千万要注意一点, 即一定要保证在使用expst/impst时不能有任何其他用户在使用Oracle数据库, 否则数据库会产生不可预知的后果甚至毁坏.
A:昨天在网上一个朋友问我,如何导入一个通过pipe导出并压缩过的文件,我特意做了一次试验:
  Oracle的导出和导入不能直接引用标准的输出和输入,但通过unix pipe可是实现,通过管道可以加快exp/imp速度
  通过管道导出数据
  1.通过mknod -p建立管道
  mknod /home/exppipe p --在目录/home下建立一个管道exppipe 注意参数p
  2.通过exp和gzip导出数据到建立的管道并压缩
  exp test/test@orcl file=/home/exppipe &
  gzip < /home/exppipe > exp.dmp.gz
  3.导出成功完成之后删除建立的管道
  rm -rf /home/exppipe
  根据我的测试,压缩导出文件只是普通大小的十分之一
  通过管道导入生成的文件
  1.建立管道
mknod /home/exppipe p
  2.导入生成的压缩文件
  imp system/passwd@orcl file=/home/exppipe fromuser=test touser=macro &
  gunzip < exp.dmp.gz > /home/exppipe
  这样就导入成功,之后删除管道
  3.删除管道
 
  rm /home/exppipe
  以上总结,PiPe真不错,能加快速度,同时还可以避免单个文件大于2G的限制。

相关文章

  • Oracle提高sql执行效率的心得建议

    Oracle提高sql执行效率的心得建议

    sql执行效率一直都是为人所关注,那到底应该怎样提高呢?有什么比较好的方法,下面与大家分享下比较不错的建议,感兴趣的朋友可以参考下,希望对大家有所帮助
    2013-08-08
  • Oracle锁表处理方式

    Oracle锁表处理方式

    文章主要介绍了如何解决Oracle数据库中的表被锁问题,包括查看被锁的表、查找锁表的进程、杀死进程等步骤,并提供了在Linux和Windows系统中杀死进程的方法
    2024-11-11
  • oracle mysql 拼接值遇到的坑及双竖线 || concat详解

    oracle mysql 拼接值遇到的坑及双竖线 || concat详解

    在Oracle中,字符串拼接有两种方法,分别是CONCAT()函数和“||”拼接,本文给大家讲解oracle mysql 拼接值遇到的坑及双竖线 || concat详解,感兴趣的朋友跟随小编一起看看吧
    2023-04-04
  • oracle中 procedure(存储过程)和function(函数)本质区别

    oracle中 procedure(存储过程)和function(函数)本质区别

    这篇文章主要介绍了 oracle中 procedure(存储过程)和function(函数)本质区别,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • navicat导入oracle导出的dmp文件

    navicat导入oracle导出的dmp文件

    现在工作中常用Oracle数据库,但是查询工具还是Navicat最好用,不论是数据导入导出,还是执行语句,都很清晰明了,下面这篇文章主要给大家介绍了关于navicat导入oracle导出的dmp文件的相关资料,需要的朋友可以参考下
    2023-05-05
  • Oracle安装监听器错误的解决方法

    Oracle安装监听器错误的解决方法

    这篇文章给大家介绍了oracle安装监听器错误的解决方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • Oracle通过时间(分钟)计算有几天几小时几分钟的方法

    Oracle通过时间(分钟)计算有几天几小时几分钟的方法

    这篇文章主要介绍了Oracle通过时间(分钟)计算有几天几小时几分钟的方法,涉及Oracle时间操作的技巧,需要的朋友可以参考下
    2015-03-03
  • oracle11g密码复杂性校验开启关闭方式

    oracle11g密码复杂性校验开启关闭方式

    这篇文章主要介绍了oracle11g密码复杂性校验开启关闭方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • oracle 发送邮件 实现方法

    oracle 发送邮件 实现方法

    oracle 发送邮件 实现方法
    2009-05-05
  • Oracle中三种表连接算法的总结

    Oracle中三种表连接算法的总结

    Oracle有三种表连接技术,分别是嵌套连接、合并连接和哈希连接。以下就是对这三种表连接算法进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07

最新评论