4

我有一个从 Oracle 表导出的大型(多 GB)数据文件。我想将此数据导入另一个 Oracle 实例,但我希望表名与原始表不同。这可能吗?如何?

导入和导出系统都是 Oracle 11g。该表包括一个 BLOB 列,如果这有什么不同的话。

谢谢!

更新

这里的想法是更新表,同时将使用它的系统的停机时间降至最低。解决方案(基于Vincent Malgrat的回答和APC的更新)是:

  1. 假设我们的表名是A
  2. 制作临时架构TEMP_SCHEMA
  3. 将我们的数据导入TEMP_SCHEMA.A
  4. CREATE REAL_SCHEMA.B AS SELECT * FROM TEMP_SCHEMA.A
  5. DROP TABLE REAL_SCHEMA.A重命名REAL_SCHEMA.AREAL_SCHEMA.A_OLD
  6. 重命名REAL_SCHEMA.BREAL_SCHEMA.A
  7. DROP REAL_SCHEMA.A_OLD

这样,停机时间仅在第 4 步和第 5 步期间,两者都应该与数据大小无关。如果这不起作用,我会在这里发布更新:-)

4

5 回答 5

5

如果您使用的是旧的 EXP 和 IMP 实用程序,则不能这样做。唯一的选择是导入同名的表(尽管您可以更改拥有该表的架构。

但是,您说您使用的是11g。为什么不使用 10g 中引入的 DataPump 实用程序,它取代了 Import 和 Export。因为在 11g 中,该实用程序提供了 REMAP_TABLE 选项,它完全符合您的要求。

编辑

在我写这篇文章时阅读了 OP 添加到另一个回复中的评论,我认为 REMAP_TABLE 选项不适用于他们的情况。它只重命名新对象。如果目标模式中存在具有原始名称的表,则导入失败并出现 ORA-39151。对不起。

编辑之二

鉴于 OP 最终选择的解决方案(删除现有表,用新表替换),有一个使用 Data Pump 的解决方案,即使用该TABLE_EXISTS_ACTION={TRUNCATE | REPLACE}子句。选择REPLACE会丢弃表格,而TRUNCATE只是,呃,截断它。无论哪种情况,我们都必须担心参照完整性约束,但这也是所选解决方案的一个问题。

我发布此附录不是为了 OP,而是为了将来某个时间找到此页面的其他寻求者的利益。

于 2009-12-14T17:14:58.157 回答
2

我想您想在已经使用该名称的模式中导入表。我认为您不能在导入期间更改表名。FROMUSER但是,您可以使用andTOUSER选项更改架构。这将允许您将表导入另一个(临时)模式。

完成后,将表复制到带有CREATE TABLE AS SELECT. 与导入相比,复制表所需的时间可以忽略不计,因此不会浪费太多时间。在操作期间,您将需要两倍的磁盘空间。

更新

正如Gary所建议的,一种更聪明的方法是在临时模式中创建一个视图或同义词,以引用目标模式中的新表。您不需要在导入后复制数据,因为它会直接进入目标表。

于 2009-12-14T17:07:37.657 回答
2

在 impdp 中使用选项 REMAP_TABLE=EXISITNG_TABLE_NAME:NEW_TABLE_NAME。这适用于 11gR2。

于 2014-08-13T20:22:07.580 回答
1

只需将其导入同名表中,然后重命名该表即可。

于 2009-12-14T16:58:36.597 回答
1

创建一个视图作为select * from ...要导入的表,该视图与导出中的表名匹配。忽略导入错误。

于 2009-12-14T17:28:12.357 回答