很多 UNIX 变种都使用一些进行文件操作的系统调用,而这些对文件的操作使用32位无符号整数来指示文件偏移量。不幸的是,32位无符号整数只限制到0到2GB的范围。
在 UNIX 系统开始接受超过2GB大小的文件时,就要求应用程序和工具程序使用替代的系统调用来操作这些大文件,比如说使用 fseek64 系统调用。之所以做出这种决定是为了避免破坏老程序,这些老程序依然使用32位整数和最初的系统调用,而无须重新编译。
Oracle 导入和导出工具是使用最初的系统调用在内部编写成的。这就意味着不能在 UNIX 系统下导出和导入超过2GB的文件,除非你使用一些诀窍将大文件拆分成小于2GB的文件。
在 Oracle 8i之前,可以使用“split”命令和命名管道将 exp的输出写到多个文件中。Split 命令接受标准的输入并将输出写到多个文件,在达到文件大小限制时切换到一个新文件。例如:
mknodpipe.dmp p
split -b
exp system/manager file=pipe.dmp full=y
rmpipe.dmp
这个过程会创建xaa、xab、xac等文件。运行以下命令可以导入这些文件:
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=
imp system/manager file=big.dmpfilesize=
因为导出文件有相当大的压缩空间,所以你依然可以使用 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