** 2Gb or Not 2Gb - File limits in Oracle (Part II) **
**_ _ **
**_ 导出( _ ** **_ Export _ ** **_ )和 _ ** **_ 2Gb _ **
_ 2Gb _ _ 导出文件的大小 _ _ _
当编写大部分版本的 Export 时,在创建导出文件上都是使用了默认的文件操作 API 。这就意味着在很多平台上根本就没有可能导出 2Gb 或者大于 2Gb 的文件系统文件( file system file )。
但是仍然有一些可选项可以用于在 Export 时解决 2Gb 的限制:
ü 将大于 2Gb 的文件导出到裸设备上基本上是没有问题的,当然这首先要求裸设备的大小必须能够容纳整个导出文件。
ü 导出到一个允许压缩或者切割的命名管道中(适用 Unix 平台)。
参看“在 Unix 平台上导出大于 2Gb 文件的快速参考”一文 [NOTE:30528.1] 。
ü 导出到磁带(适用大多数平台)
参看“在 Unix 系统中导出到磁带”一文 [NOTE:30428.1] 。(这篇文章同时页详细描述了如何导出到 Unix 管道和远程 shell 中)
ü Oracle8i 允许导出到多个小文件中,以替代单一的大文件。
_ 其它的 _ _ 2Gb _ _ 导出问题 _ _ _
Oracle 允许区( extent )的尺寸最大为 2Gb 。但是不幸的是,在大多数的 Oracle 发行版中 Export 都存在这样一个问题,当你 Export 一个大文件,并且指定了 COMPRESS=Y ,那么就有可能在导出文件的 NEXT 存储子句中包含了一个大于 2Gb 的值。这样将会导致 Import 失败,即使是在 Import 时候指定了 IGNORE=Y 。 Oracle 已经在在 [BUG:708790] 中报告了这个问题,并且在 [NOTE:62436.1] 中提出了警告。
当 Export 碰到 2Gb 限制的时候,会报类似下面的错误:
. . exporting table BIGEXPORT
EXP-00015: error on row 10660 of table BIGEXPORT,
column MYCOL, datatype 96
EXP-00002: error in writing to export file
EXP-00002: error in writing to export file
EXP-00000: Export terminated unsuccessfully
在 [BUG:185855] 中提到了第二个问题,这个问题指出一个全库导出产生的 CREATE TABLESPACE 命令将在文件大小上使用 BYTES 为单位,如果文件大小超过 2Gb ,那么在导入的时候就会产生一个 ORA-2237 错误。这个问题可以通过在导入之前先以 M 为单位而不是 BYTES 为单位来创建表空间这样的方法来解决。 [BUG:490837] 也指出了相类似的问题。
_ 导出到磁带 _ _ _
导出的时候 VOLSIZE 参数限制在 4Gb 以下,在有些平台上可能只有 2Gb 。
在 Oracle8i 中已经修正了这个问题。 [BUG:490190] 中对此问题有所描述。
**_ SQL*Loader _ ** **_ 和 _ ** **_ 2Gb _ **
在 SQL*Loader 试图打开一个超过 2Gb 的文件时,将会报以下错误:
SQL*Loader-500: Unable to open file (bigfile.dat)
SVR4 Error: 79: Value too large for defined data type
在 [NOTE:30528.1] 中的例子可以稍作修改以使在 SQL*Loader 中使用大的输入文件。
Oracle 8.0.6 在 SQL*Loader 中已经对 discard file 和 log file 实现了大文件支持,但是对于输入的 data file 在各个平台上仍然时不一样的。 [BUG:948460] 中记录了输入文件大小限制的详细信息。 [BUG:749600] 则记录了最大的 discard file 文件大小。
**_ Oracle _ ** **_ 和其它的 _ ** **_ 2Gb _ ** **_ 问题 _ ** **_ _ **
这个章节列举了其它各色 2Gb 问题。
l Oracle 8.0.5 版本以后在大部分的平台上 Oracle 都提供了 64 位的版本。从 8.0.5 的 README 文件中可以看到相应的介绍- [NOTE:62252.1]
l DBV (数据库验证程序)可能无法扫描超过 2Gb 的数据文件,并会报 DBV-100 错误。在 [BUG:710888] 中报告了此错误。
l 如果要在 Oracle 中创建大于 2Gb 的文件, SQL 命令行的 "DATAFILE ... SIZE xxxxxx" 子句部分必须以 M 或者 K 作单位来指定,否则将会报 "ORA-02237: invalid file size" 错误。在 [BUG:185855] 中报告了此错误。
l 在 Oracle 7.3.4 发行版以前表空间的限额不能超过 2Gb 。比如:
ALTER USER
1<username> QUOTA 2500M ON <tablespacename>
2
3这样将会报 " ORA-2187: invalid quota specification." 错误。
4
5在 [BUG:425831] 中报告了此错误。解决方法是如果一个用户需要超过 2Gb 的限额,那么就给他赋予 UNLIMITED TABLESPACE 权限。
6
7l 如果 spool 的输出文件达到了 2Gb ,那么会出现错误。比如: SQLPLUS 的命令 spool 。
8
9l 在 Oracle 工具中的一些 CORE 函数不支持大文件。 [BUG:749600] 中报告了此错误,在 Oracle 8.0.6 和 8.1.6 版本中已经修正了。但是要注意在 Oracle 8.1.5 和别的任何补丁中都没有修改这个错误。另外即使已经有修正,但是仍然还会有大文件限制因为不是所有的代码都使用了这些 CORE 函数。
10
11注意: [BUG:749600] 虽然阐明了 CORE 函数,但是代码的某些部分仍然有问题。比如: SQL*Loader 中输入文件的读取就没有使用 CORE 。
12
13l UTL_FILE 包使用了上述的 CORE 函数,所以在没有修正的 Oracle 版本中仍然有 2Gb 限制。 <package:utl_file> 是一个允许在 PL/SQL 中进行文件存取的 PL/SQL 包。
14
15**_ 特定平台中的大文件 _ ** **_ _ **
16
17下面是一些特定平台中关于大文件支持的参考资料。虽然我们已经努力使这些文章的资料始终保持更新,但是仍然建议在存取大文件时对每一个操作要小心谨慎地测试。
18
19平台
20
21|
22
23参考
24
25---|---
26
27AIX (RS6000 / SP)
28
29|
30
31[NOTE:60888.1]
32
33HP
34
35|
36
37[NOTE:62407.1]
38
39Digital Unix
40
41|
42
43[NOTE:62426.1]
44
45Sequent PTX
46
47|
48
49[NOTE:62415.1]
50
51Sun Solaris
52
53|
54
55[NOTE:62409.1]
56
57Windows NT
58
59|
60
61FAT 文件系统支持最大 4Gb 的文件
62
63NTFS 文件系统理论上支持最大 16Tb 的文件
64
651 .在 NT 的 Oracle8 上使用大文件之前请先参考 [NOTE:67421.1]
66
672 . Oracle 8.1.6 的 DBVERIFY 程序有问题(参考 [BUG:1372172] )
68
693 .在 8.1.6 / 8.1.7 中自动扩展到 4Gb 时会出现问题导致数据库崩溃。(参考 [BUG:1668488] )</package:utl_file></tablespacename></username>