Oracle 导出和导入

Oracle Export and Import

一些背景:

在大约十年前(给予或接受)Oracle 10 的某个地方,Oracle 添加了一种导出和导入数据库的新方法,称为 Oracle Data Pump. Aside from the silly name, the functionality works mostly the same as the Original Export and Import Utility

原始实用程序的 link 包含以下警告文本,看起来至少有些自相矛盾:

Original export is desupported for general use as of Oracle Database 11g. The only supported use of Original Export in 11g is backward migration of XMLType data to a database version 10g release 2 (10.2) or earlier. Therefore, Oracle recommends that you use the new Data Pump Export and Import utilities, except in the following situations which require Original Export and Import:

  • You want to import files that were created using the original Export utility (exp).

  • You want to export files that will be imported using the original Import utility (imp). An example of this would be if you wanted to export data from Oracle Database 10g and then import it into an earlier database release.

据我所知,ExpImp 无法正常运行的唯一原因是数据库使用了 11g 以后引入的功能。否则,旧的 ExpImp 命令似乎应该可以正常工作,并且从上面看,它们确实得到了官方支持。

"Data Pump" 与 "Original" 导出的主要区别之一——这对我的应用程序很重要——是数据泵仅在服务器端运行,这意味着用户将需要至少对服务器有某种程度的权限以访问导出生成的文件。最好的情况是,这很不方便,最坏的情况是,这会导致除 dba 以外的任何人都无法访问文件。

问题:

当我们从 11g 升级到 12c 时,我们在使用原始导出实用程序时遇到了问题。它会 运行 成功地导出触发器,然后产生如下错误:

EXP:00056 ORACLE error 4063 encountered
ORA-06508: package body XDB.DBMS_XDBUTIL_INT has errors
ORA-06508: PL/SQL: could not find program unit being called:
"XDB.DBMS_XDBUTIL_INT"

问题:

这个问题在不同的情况下至少出现了十几次,我们正在玩打地鼠游戏。最近解决它的尝试涉及重新编译服务器上的每个包,这需要大约半小时。

  1. 为什么这个出口问题不断出现?
  2. ExpImp 实际上正式弃用了,以至于我们不能再可靠地使用它们了吗?
  3. 是否有任何其他直接的方法来获取数据库的客户端导出?
  1. 为什么这个导出问题一直出现?

    由于问题是间歇性的,我猜这是由延迟的段创建引起的。从 11g 开始,tables 和分区可以配置为在有一些数据之前不分配任何 space。 (这可以为具有许多空分区的 table 节省大量的 space。)但是 Exp 不理解这一点并假设每个 table 必须有一个段。这意味着一些 table 和相关功能可能 "randomly" 会导致问题,具体取决于它们最近是否被填充或截断。

    您可以通过以下查询找到那些 table:

    select * from dba_tables where segment_created = 'NO';
    

    然后强迫他们用这个语句进行分段:

    alter table table_name allocate extent;
    
  2. Exp 和 Imp 是否实际上已正式弃用,以至于我们无法再可靠地使用它们?

    这是 debatable 但我会说是的,原来的 Exp 和 Imp 现在确实是 "deprecated"。确实感觉 Oracle 与弃用软件玩了很多游戏。例如,弃用超级昂贵的 Goldengate 的免费更改数据捕获,或者当几乎没有人愿意使用其昂贵的容器时弃用非容器架构。但是时间久了,Exp和Imp都不剪了。

  3. 是否有任何其他直接的方法来获取数据库的客户端导出?

    尝试OCP, Oracle CoPy。您仍然需要在服务器上生成导出。但是 OCP 允许您在没有任何服务器文件系统权限的情况下将文件从服务器文件系统下载到客户端文件系统。它仍然不像它应该的那样直截了当,但至少你不必给每个人在服务器文件系统上的权限。