在 UNIX 系统下导出超过2GB的数据库

ZDNet软件频道 时间:2004-11-17 作者:Builder.com |  我要评论(6)
本文关键词:opensource oracletips sqltips
很多 UNIX 变种都使用一些进行文件操作的系统调用,而这些对文件的操作使用32位无符号整数来指示文件偏移量。不幸的是,32位无符号整数只限制到0到2GB的范围。
本文译自Builder.com,未经许可请勿转载

很多 UNIX 变种都使用一些进行文件操作的系统调用,而这些对文件的操作使用32位无符号整数来指示文件偏移量。不幸的是,32位无符号整数只限制到0到2GB的范围。

在 UNIX 系统开始接受超过2GB大小的文件时,就要求应用程序和工具程序使用替代的系统调用来操作这些大文件,比如说使用 fseek64 系统调用。之所以做出这种决定是为了避免破坏老程序,这些老程序依然使用32位整数和最初的系统调用,而无须重新编译。

Oracle 导入和导出工具是使用最初的系统调用在内部编写成的。这就意味着不能在 UNIX 系统下导出和导入超过2GB的文件,除非你使用一些诀窍将大文件拆分成小于2GB的文件。

在 Oracle 8i之前,可以使用“split”命令和命名管道将 exp的输出写到多个文件中。Split 命令接受标准的输入并将输出写到多个文件,在达到文件大小限制时切换到一个新文件。例如:

mknodpipe.dmp p
split -b 2047m < pipe.dmp &
exp system/manager file=pipe.dmp full=y
rmpipe.dmp

这个过程会创建xaaxabxac等文件。运行以下命令可以导入这些文件:

mknodpipe.dmp p
cat xaaxabxac > pipe.dmp &
imp system/manager file=pipe.dmp full=y
rmpipe.dmp

从 Oracle 8i开始,Oracle 添加了一个命令行参数filesize,其作用有点与 split命令的作用类似。它会自动地将输出创建为一组文件,而不是单一一个的文件。确保filesize小于2GB这一点是非常重要的,而且在导入时指定同样的参数也是非常重要的。

exp system/manager file=big.dmpfilesize=2000M full=y

imp system/manager file=big.dmpfilesize=2000M full=y

因为导出文件有相当大的压缩空间,所以你依然可以使用 split 导出到一个大概10GB的文件中,并且依然保持不超过2GB的限制。

mknodpipe.dmp p
compress < pipe.dmp > expdat.dmp.Z &
exp system/manager file=pipe.dmp full=y
rmpipe.dmp

下面是导入一个文件的代码:

mknodpipe.dmp p
uncompress expdat.dmp.Z > pipe.dmp &
imp system/manager file=pipe.dmp full=y
rmpipe.dmp


本文作者:Scott Stephens 已经在 Oracle 工作了13年有余,他曾经在技术支持、电子商务、市场和软件开发等部门工作。


责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134