我有一个从 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
删除 REAL_SCHEMA.A_OLD
这样,停机时间只发生在第 4 步和第 5 步期间,两者都应该与数据大小无关。如果这不起作用,我会在这里发布更新 :-)
最佳答案
如果您使用的是旧的 EXP 和 IMP 实用程序,则无法执行此操作。唯一的选择是导入同名表(尽管您可以更改拥有该表的架构。
但是,你说你在11g上。为什么不使用 10g 中引入的 DataPump 实用程序,它取代了 Import 和 Export。因为在 11g 中,该实用程序提供了 REMAP_TABLE 选项,它可以完全满足您的需求。
编辑
在我写这篇文章时阅读了 OP 添加到另一个响应的评论,我认为 REMAP_TABLE 选项不适用于他们的情况。它只重命名新对象。如果目标模式中存在具有原始名称的表,则导入将失败并返回 ORA-39151。对不起。
编辑之二
鉴于 OP 最终选择的解决方案(删除现有表,替换为新表),有一个数据泵解决方案,即使用 TABLE_EXISTS_ACTION={TRUNCATE | REPLACE}
子句。选择 REPLACE
会删除表格,而 TRUNCATE
只是,呃,截断它。无论哪种情况,我们都必须担心参照完整性约束,但这也是所选解决方案的一个问题。
我发布此附录不是为了 OP,而是为了将来某个时间找到此页面的其他搜索者的利益。
关于database - Oracle -- 将数据导入到具有不同名称的表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1902102/