我有一个从Oracle表导出的大型(多GB)数据文件。我想将此数据导入另一个Oracle实例,但我希望表名与原始表不同。这可能吗?怎么样?
导入和导出系统都是Oracle 11g。该表包含BLOB列,如果这有任何不同。
谢谢!
更新:
这里的想法是更新表,同时将系统的停机时间保持在最低限度。解决方案(基于Vincent Malgrat的回答和APC的更新)是:
A
TEMP_SCHEMA
TEMP_SCHEMA.A
CREATE REAL_SCHEMA.B AS SELECT * FROM TEMP_SCHEMA.A
DROP TABLE REAL_SCHEMA.A
REAL_SCHEMA.A
重命名为REAL_SCHEMA.A_OLD
REAL_SCHEMA.B
重命名为REAL_SCHEMA.A
DROP REAL_SCHEMA.A_OLD
这样,停机时间仅在步骤4和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)
我想你想要在已经使用名称的模式中导入表。我不认为你可以在导入过程中更改表名。但是,您可以使用FROMUSER
和TOUSER
选项更改架构。这将允许您在另一个(临时)架构中导入表。
完成后,使用CREATE TABLE AS SELECT
将表复制到目标架构。与导入相比,复制表所需的时间可以忽略不计,因此不会浪费太多时间。在操作过程中,您将需要两倍的磁盘空间。
正如Gary所建议的,更聪明的方法是在临时模式中创建一个视图或同义词,该模式引用目标模式中的新表。导入后您不需要复制数据,因为它将直接通过目标表。
答案 2 :(得分:2)
在impdp中使用选项REMAP_TABLE = EXISITNG_TABLE_NAME:NEW_TABLE_NAME。这适用于11gR2。
答案 3 :(得分:1)
只需将其导入到具有相同名称的表中,然后重命名该表。
答案 4 :(得分:1)
创建一个视图,作为要导入的表的select * from ...
,其视图与导出中的表名相匹配。导入时忽略错误。