Tag Archives: ‘Data pump’

导致 Oracle 10gR2 出现 ORA-39095 的另一种原因

Oracle 10g R2 的 Data Pump 是一个好工具,弥补了传统 export/import 工具的很多不足。相关信息可以参考一下我以前对 Data Pump 的介绍
最近在 Linux 平台上经常遇到 ORA-39095 错误。这个错误。这个错误号,文档的解释:

ORA-39095:Dump file space has been exhausted: Unable to allocate string bytes
Cause: The Export job ran out of dump file space before the job was completed.
Action: Reattach to the job and add additional dump files to the job restarting the job.

这个解释只针对一般情况。我遇到的这个案例,目录的空间还有很多,可是也一样报错了。而且,一般在第 100 个 导出文件出错(更正:%U参数是2位,定长的,最大99)。开始以为是 Bug,可是遍查 Metalink,发现和 ORA-39095 错误有关只有两条信息,和我遇到的情况不符。
偶然在阅读 Oracle Database Utilities 手册的时候,发现了这一段话:

Because each active worker process or I/O server process writes exclusively to one file at a time, an insufficient number of files can have adverse effects. Some of the worker processes will be idle while waiting for files, thereby degrading the overall performance of the job. More importantly, if any member of a cooperating group of parallel I/O server processes cannot obtain a file for output, then the export operation will be stopped with an ORA-39095 error. Both situations can be corrected by attaching to the job using the Data Pump Export utility, adding more files using the ADD_FILE command while in interactive mode, and in the case of a stopped job, restarting the job.

真是孤陋寡闻了,我的并行度用的是 4 ,减小这个并行度,该错误不再出现。

You can supply multiple file_name specifications as a comma-delimited list or in separate DUMPFILE parameter specifications. If no extension is given for the filename, then Export uses the default file extension of .dmp. The filenames can contain a substitution variable (%U), which implies that multiple files may be generated. The substitution variable is expanded in the resulting filenames into a 2-digit, fixed-width, incrementing integer starting at 01 and ending at 99. If a file specification contains two substitution variables, both are incremented at the same time. For example, exp%Uaa%U.dmp would resolve to exp01aa01.dmp, exp02aa02.dmp, and so forth.

EOF

关于 Oracle 10g EXPDP 的 EXCLUDE 参数

Oracle 10g 的 Data Pump 是个不错的新特性,因为新(其实 10g 也发布好几年了),所以也存在不少问题。
比如 EXPDP 的 EXCLUDE 参数,expdp help=y 输出的内容是这样说明的:

EXCLUDE Exclude specific object types, e.g. EXCLUDE=TABLE:EMP.

可是实际上用这样的格式却是不正确的,会得到一个错误提示信息:

ORA-39071: Value for EXCLUDE is badly formed.

正确的格式是啥? 如果第一次遇到或许还有些不知就里,莫明其妙。在 ITpub 上有个讨论,有朋友贴的文档给出了正确的语法:

EXCLUDE=TABLE:"IN ('TABLENAME1', 'TABLENAME2')"

对于 EXCLUDE/INCLUDE 参数还要注意的是二者不能共用。此外,Linux 和 Windows 下的命令行可能要对转义符号注意一点。
这个语法问题存在好久了,应该算是文档的 Bug ? Oracle 还没有进行修正。
EXPDP 我还遇到另外一个问题,生成的文件超过 99 个就会报错。有谁遇到过没?
EOF
BTW: 最近看到有朋友批评我写的东西没意思,其实首先要明确一点,我写的东西基本上是比较简单的所谓”技术”, 另外我也不知道写什么有意思,众口难调,而且,写多了我也腻。

Oracle 10G的Data Pump (Part I)

Oracle 10G的Data Pump技术能够在不同数据库间高速的移动数据库和元数据. 这个技术的基础是两个数据移动工具:Data Pump Export和Data Pump Import.

Oracle的Data Pump是通过一个PL/SQL包来实现的:DBMS_DataPump(也叫Data Pump API).Data Pump使用直接路径装载和外部表机制进行数据的移动. Data Pump使用DBMS_METADATA PL/Sql包进行包括ETL过程在内的所有的数据库对象操作.

Data Pump 是Oracle一些其它关键特性(如基于流的复制、逻辑Standby等、Grid)的基础。

Data Pump特性是集成到Oracle数据库10G中的,但是标准版本10G并行度只有1.

关键概念

Master Table

Master Table(MT)是Data Pump技术的核心.Master Table 用来保存整个过程中的细节信息(也可以说是一些元数据信息).有了MT,导出或者导入的重启动才变为可能.这些细节信息包括:

  • 产生Job状态的报告
  • 重新启动Job
  • 定位在Dump文件中的所有的对象.

主表在进行当前导出或者导入的操作的用户模式中被创建.该用户必须要有足够空间. 主表的名字和创建它的Job名字相同.这也就是说,你不能显式的指定一个和现有的表或者视图重名的Data Pump Job.

导出的时候,主表被创建,并在完成的时候写到Dump文件中.在启动导入的时候,主表从Dump文件集中载入到数据库中,并用来控制操作的顺序.主表也可以用一些参数来进行初始化操作.要注意的是主表不能跨文件存储.所以,指定的 Dump 文件的大小至少要能够容纳得下 MT .

主表依如下情况或被保留或者删除:

  • Job成功完成,MT 被删除.
  • 如果Job是使用STOP_JOB交互命令停掉的,MT将被保留以用来重启动Job.
  • 如果Job是使用KILL_JOB交互命令Kill掉的,MT将被删除,并且Job不能重新启动.
  • 如果Job意外中止,MT总是被保留.

继续阅读