Oracle -- 如何将数据导入一个不同于表名的表中?

4
我有一个大型(多GB)的数据文件,是从Oracle表中导出的。我想将这些数据导入到另一个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.AREAL_SCHEMA.A 重命名为 REAL_SCHEMA.A_OLD
  6. REAL_SCHEMA.B 重命名为 REAL_SCHEMA.A
  7. DROP REAL_SCHEMA.A_OLD

这样,停机时间只会出现在步骤4和5中,两者都应该与数据大小无关。如果这种方法不起作用,我会在这里发布更新 :-)


1
您可以通过在第5步将 REAL_SCHEMA.A 重命名为其他名称,然后在第7步慢慢删除它来最小化停机时间。 - APC
谢谢APC,我已经更新了上面的内容,包括你的建议! - Arkady
5个回答

5
如果您使用旧的EXP和IMP实用程序,则无法执行此操作。唯一的选择是导入到同名表中(虽然您可以更改拥有该表的模式)。
但是,您说您正在使用11g。为什么不使用在10g中引入的DataPump实用程序,它取代了Import和Export。因为在11g中,该实用程序提供了REMAP_TABLE选项,正是您想要的。
编辑
阅读我写这篇文章时OP添加到另一个响应中的评论后,我认为REMAP_TABLE选项在他们的情况下不起作用。它只重命名新对象。如果目标模式中存在具有原始名称的表,则导入将失败并显示ORA-39151。抱歉。
编辑bis
鉴于OP最终选择的解决方案(删除现有表格,替换为新表格),存在一种使用Data Pump的解决方案,即使用TABLE_EXISTS_ACTION = {TRUNCATE | REPLACE}子句。选择REPLACE会删除表格,而TRUNCATE仅仅截断表格。无论哪种情况,我们都要担心引用完整性约束,但这也是所选解决方案的问题。
我发布这个附录不是为了OP,而是为了其他在未来某个时候找到此页面的寻求者的利益。

谢谢,我会记住这个建议,下次会注意的。现在我必须使用由exp生成的原始导出数据文件。 - Arkady
+1: 很好,我在文档中一直在找这个,我非常确定使用expdp是可能的。 - Vincent Malgrat

3
我猜您想要在已使用名称的模式中导入表。我不认为您可以在导入期间更改表名。但是,您可以使用 FROMUSERTOUSER 选项更改模式。这将允许您在另一个(临时)模式中导入表。
完成后,使用 CREATE TABLE AS SELECT 将表复制到目标模式中。与导入相比,复制表所需的时间将是微不足道的,因此这不会浪费太多时间。但是,在操作期间需要两倍的磁盘空间。
更新
Gary建议的那样,更聪明的方法是在临时模式中创建引用目标模式中新表的视图或同义词。导入后,数据将直接传递到目标表,无需复制数据。

我相信这会起作用!谢谢。这里有一个小问题,表的大部分是BLOB,所以CREATE TABLE AS SELECT会花一些时间,但我可以处理。 - Arkady
1
如果您在TOUSER中预先创建了一个视图,使用SELECT * FROM destuser.newtable,那么插入操作将直接通过该视图传递到新表中。至少在使用IMP IGNORE=Y时会起作用。也可以尝试使用同义词。 - Gary Myers

2

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


1

只需要将其导入与同名的表格中,然后更改表格名称即可。


1
+1 同意。如果表已经存在,您必须将其重命名,然后导入数据,将新表重命名为所需名称,然后将原始表重命名回其原始名称。 - Aaron Digulla
我有一个正在使用所讨论的表(称其为“A”)的系统,我不想因为导入需要的时间而将其关闭。我希望这样做:将数据导入到表“B”中,然后删除“A”,并将“B”重命名为“A”。这将避免长达数小时的停机时间。 - Arkady

1
创建一个视图,其内容为 select * from ... 从要导入的表中选择,视图名称与导出表的名称匹配。在导入时忽略错误。

据我所知,视图不能与现有表具有相同的名称。 - Thorsten
不,你需要使用导入文件使用的名称创建视图,并使用你想要的表名创建表。 - David Aldridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接