Oracle - 将数据导入到具有不同名称的表中?

时间:2009-12-14 16:57:21

标签: database oracle import oracle11g

我有一个从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.A重命名为REAL_SCHEMA.A_OLD
  6. REAL_SCHEMA.B重命名为REAL_SCHEMA.A
  7. DROP REAL_SCHEMA.A_OLD
  8. 这样,停机时间仅在步骤4和5中,两者都应与数据大小无关。如果这不起作用,我会在这里发布更新: - )

5 个答案:

答案 0 :(得分: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,而是为了将来某个时间找到此页面的其他搜索者的利益。

答案 1 :(得分:2)

我想你想要在已经使用名称的模式中导入表。我不认为你可以在导入过程中更改表名。但是,您可以使用FROMUSERTOUSER选项更改架构。这将允许您在另一个(临时)架构中导入表。

完成后,使用CREATE TABLE AS SELECT将表复制到目标架构。与导入相比,复制表所需的时间可以忽略不计,因此不会浪费太多时间。在操作过程中,您将需要两倍的磁盘空间。

更新

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

只需将其导入到具有相同名称的表中,然后重命名该表。

答案 4 :(得分:1)

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