Oracle 导出和导入

Posted

技术标签:

【中文标题】Oracle 导出和导入【英文标题】:Oracle Export and Import 【发布时间】:2018-07-06 00:16:59 【问题描述】:

一些背景:

在大约十年前的 Oracle 10 附近(给予或接受),甲骨文添加了一种导出和导入数据库的新方法,称为 Oracle Data Pump。除了愚蠢的名称之外,该功能的工作原理大部分与Original Export and Import Utility 相同。

原始实用程序的链接包含以下警告文本,这似乎至少有些自相矛盾:

从 Oracle 数据库开始,不支持原始导出以供一般使用 11克。 11g 中唯一支持的 Original Export 使用是向后的 将 XMLType 数据迁移到数据库版本 10g 第 2 版 (10.2) 或更早。因此,Oracle 建议您使用新的 Data Pump Export 和 Import 实用程序,以下情况除外 需要原始导出和导入:

您要导入使用原始导出实用程序 (exp) 创建的文件。

您想要导出将使用原始导入实用程序 (imp) 导入的文件。这方面的一个例子是,如果你想 从 Oracle 数据库 10g 中导出数据,然后将其导入到 较早的数据库版本。

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

“数据泵”与“原始”导出的主要区别之一(这对我的应用程序很重要)是数据泵仅在服务器端运行,这意味着用户至少需要某种程度的服务器访问导出生成的文件的权限。最好的情况是不方便,最坏的情况是,这会导致文件无法被 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"

问题:

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

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

【问题讨论】:

这似乎不是a common error。您是否对此提出过服务请求? (诚​​然,他们可能只是告诉你升级,这并不完全有帮助......但也可能有一个修复)。有点跑题了,但是您的 11g 和 12c 实例是否无法相互通信以进行网络链接导出;或者说共享一个可以用作转储目录的 NFS 挂载? 升级问题是很久以前的问题了...这是最近再次出现的问题,使用的是稳定的 12c 设置。这个问题在许多不同的 Oracle 服务器上重复出现,所以我觉得我们使用 Oracle 的方式可能是导致它的原因。 至于 NFS 挂载,它会产生类似的问题,但由于复杂性的原因我无法深入探讨。 所以当你在 12c 的 exp 时看到这个,或者在做其他事情的时候?您是否能够在开始导出之前立即检查该包的状态(以防它们未链接,而exp 恰好注意到它已经无效)? 听起来某些东西正在被定期删除或撤销(例如,请参阅 doc ID 2161205.1),可能是通过自动安全工具或其他东西;并重新编译所有内容(我假设您的意思是utlrp)会临时重新创建或重新授予它。然后exp 工作,直到它再次被删除。但真的只是猜测。如果您不知道这样的事情,我认为这可能是您需要提出 SR 的事情。 【参考方案1】:

    为什么这个出口问题不断出现?

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

    您可以使用此查询找到这些表:

    select * from dba_tables where segment_created = 'NO';
    

    然后用这个语句强迫他们有段位:

    alter table table_name allocate extent;
    

    Exp 和 Imp 实际上是否正式被弃用,以至于我们不再能够可靠地使用它们?

    这是值得商榷的,但我会说是的,原来的 Exp 和 Imp 现在真的被“弃用”了。确实感觉甲骨文玩了很多不推荐使用的软件。例如,弃用超级昂贵的 Goldengate 的免费变更数据捕获,或者在几乎没有人想要使用其昂贵的容器时弃用非容器架构。但是已经很久了,Exp和Imp不再削减它了。

    还有其他直接的方法来获取数据库的客户端导出吗?

    试试OCP, Oracle CoPy。您仍然需要在服务器上生成导出。但是 OCP 允许您将文件从服务器文件系统下载到客户端文件系统,而无需任何服务器文件系统权限。它仍然没有应有的直接,但至少您不必授予每个人对服务器文件系统的权限。

【讨论】:

我会研究建议 #1,看看它告诉我们什么。

以上是关于Oracle 导出和导入的主要内容,如果未能解决你的问题,请参考以下文章

oracle 怎么导出和导入整个orcl数据库,包括用户和授权

oracle 怎么导出和导入整个orcl数据库,包括用户和授权

ORACLE 如何只导出导入索引?

oracle sql deveploper数据库的导入导出

如何用plsql从oracle中导入导出数据

oracle 数据库导入导出